tkinter bind方法支援引數傳遞

2021-08-23 12:24:06 字數 3245 閱讀 4194

from tkinter import *

from tkinter import messagebox

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):

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)

lb.bind(sequence='', func=self.handler_adaptor(self.handler, lb=lb, top=top))

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)

def handler(self, event, top, lb):

"""事件處理函式"""

content = lb.get(lb.curselection())

return messagebox.showinfo(title="hey, you got me!", message="i am ".format(content), parent=top)

def handler_adaptor(self, fun, **kwds):

"""事件處理函式的介面卡,相當於中介,那個event是從那裡來的呢,我也納悶,這也許就是python的偉大之處吧"""

return lambda event, fun=fun, kwds=kwds: fun(event, **kwds)

if __name__ == "__main__":

win_program = win_program()

win_program.widget_to_center(win_program.get_db_configure(), 500, 400)

mainloop()

lb.bind(sequence='', func=self.handler_adaptor(self.handler, lb=lb, top=top))
需要注意的是,bind方法sequence入參是描述滑鼠、鍵盤的操作事件,func入參可傳入乙個呼叫函式,但傳遞的函式必須是乙個帶event引數的方法,而且只能有這麼乙個引數。舉個例子: 

定義如下函式:

def no_other_argues(self, event):

print("you got me!")

bind方法func入參可換成這樣:

lb.bind(sequence='', func=self.no_other_argues)
雙擊,可以在執行**視窗看到輸出。

重點來了

但很多時候,不支援傳遞引數的bind方法,並不能滿足我們的需求。若需要bind方法的func入參支援多引數,該如何解決呢?這個只能曲線救國了,需要定義乙個函式中介:

def handler_adaptor(self, fun,  **kwds):

"""事件處理函式的介面卡,相當於中介,那個event是從那裡來的呢,我也納悶,這也許就是python的偉大之處吧"""

return lambda event, fun=fun, kwds=kwds: fun(event, **kwds)

然後再定義自己真正要執行的函式:

def handler(self, event, top, lb):

"""事件處理函式"""

content = lb.get(lb.curselection())

return messagebox.showinfo(title="hey, you got me!", message="i am ".format(content), parent=top)

如此,bind方法就能支援引數傳遞了。

最終效果如下: 

如何支援clone方法

1 實現cloneable介面,因為object的clone方法將檢查類是否實現了cloneable介面,如果沒有將丟擲異常clonenotsupportedexception物件。cloneable介面沒有任何方法,只是個標誌,所以只需要簡單得寫上implements cloneable即可。2 ...

tomcat支援中文URI方法

為了便於和客戶溝通,我打算把axure匯出來的產品原型部署到tomcat伺服器上 內網剛好用這麼一台tomcat伺服器 部署上去後發現頁面無法正常開啟,都是404頁面。仔細檢視一下,估計是因為我的頁面檔案都是中文名字命名的緣故吧。如何讓tomcat支援中文uri呢?方法如下 在server.xml配...

黑箱方法 支援向量機

支援向量機 support vector machine,svm 是corinna cortes和vapnik等於1995年首先提出的,它在解決小樣本 非線性及高維模式識別中表現出許多特有的優勢,並能夠推廣應用到函式 擬合等其他機器學習問題中。svm幾乎可以適用於所有的學習任務,包括分類和數值 兩個...