Listbox 與 Scrollbar 聯動設定
阿新 • • 發佈:2018-11-30
接著上一篇的博文(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)
好了,大功告成, 聯動設定看起來也不是很難。效果圖: