接着上一篇的博文(tkinter 居中处理),接下来,需要在新建的窗口加点内容。
先上今天的代码:
from tkinter import *
class Win_Program:
def __init__(self):
self.master = Tk()
self.master.state("zoomed") # 窗口最大化
self.master.title("demo")
self.master.grid()
self.databases = list()
self.var = StringVar()
for i in range(40):
self.databases.append("database"+str(i))
def get_db_configure(self):
top = Toplevel(self.master)
top.title("数据库配置")
top.resizable(0,0) # 大小不可变
# 创建的Toplevel对象 在最上层
top.attributes("-toolwindow", 1)
top.wm_attributes("-topmost", 1)
top.grid()
sb = Scrollbar(top)
sb.grid(row=0, rowspan=20, sticky=E+NS, padx=10, pady=5, column=1)
lb = Listbox(top, listvariable=self.var, width=65, yscrollcommand=sb.set, selectmode=SINGLE, height=20)
for i in range(len(self.databases)):
lb.insert(0, self.databases[i])
lb.grid(row=0, rowspan=20, column=0, padx=5, pady=5)
# Listbox 滚动时,通过lb.yview方法 通知到 Scrollbar 组件
sb.config(command=lb.yview)
return top
def widget_to_center(self, master, width, height):
# 获取屏幕长/宽
self.width = self.master.winfo_screenwidth()
self.height = self.master.winfo_screenheight()
x = self.width / 2 - width / 2
y = self.height / 2 - height / 2
master.geometry('%dx%d+%d+%d' % (width, height, x, y))
master.grid()
print(self.width, self.height, x, y)
if __name__ == "__main__":
win_program = Win_Program()
win_program.widget_to_center(win_program.get_db_configure(), 500, 400)
mainloop()
数据库设置页面,当然是展示数据库的信息了,本着删繁就简的原则,数据库配置就不从文件读取了,以一个列表代替:
self.databases = list()
for i in range(40):
self.databases.append("database"+str(i))
程序运行时,有且仅有一个数据库连接,所以这里需要可一个单选的选择数据库配置的组件。对于单选框,Listbox 与 Radiobutton 都是一个不错的选择。由于Radiobutton是选择按钮,而此处是一组列表选项,Listbox更加符合需求:
lb = Listbox(top, listvariable=self.var, width=65, yscrollcommand=sb.set, selectmode=SINGLE, height=20)
for i in range(len(self.databases)):
lb.insert(0, self.databases[i])
lb.grid(row=0, rowspan=20, column=0, padx=5, pady=5)
创建lb对象时,参数listvariable=self.var 是一个定义的变量在 init 函数中定义,在python语法中是不用去定义一个变量是什么类型,但是此处为什么要声明呢?原因就是tkinter 本质上并不是python写的。扯远了,这个参数很重要,若没有这个参数,你不能关联lb对象中的每一组内容,继而不能实现单选的操作。 Listbox中的入参height=20
与其它组件的height表达的意思稍有不同,此处为该列表可以展示20行,默认是10行数据。selectmode=SINGLE
设置选择模式为单选模式(该组建还支持 BROWSE,MULTIPLE,EXTENDED 这三种模式)。
下一步就是本期重点了,滚动条联动设置,首先在窗口右侧生成一个滚动条:
sb = Scrollbar(top)
sb.grid(row=0, rowspan=20, sticky=E+NS, padx=10, pady=5, column=1)
设置当右侧滚动条滚动时,左侧的数据库配置会跟着动。通过 Listbox 的入参进行设置::
yscrollcommand=sb.set
设置当滚动左侧数据库配置时,右侧滚动条也会跟着动:
# Listbox 滚动时,通过lb.yview方法 通知到 Scrollbar 组件
sb.config(command=lb.yview)
好了,大功告成, 联动设置看起来也不是很难。效果图: