1. 程式人生 > >Listbox 與 Scrollbar 聯動設定

Listbox 與 Scrollbar 聯動設定

接著上一篇的博文(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)

好了,大功告成, 聯動設定看起來也不是很難。效果圖:
滾動條聯動