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幾乎可以適用於所有的學習任務,包括分類和數值 兩個...