[英]Python Tkinter Avoid using "root" name in lower level function
受到 300 多票已結束問答的啟發: 構建 tkinter 應用程序的最佳方式? ,我希望避免在類中的函數中顯式使用root
。 我認為它應該通過self
或parent
或類似的東西隱式聲明。 這是有問題的代碼:
我有這個代碼...
self.label_this = tk.StringVar()
self.label_last = tk.StringVar()
self.label_total = tk.StringVar()
tk.Label(count_frame, textvariable=self.label_this, \
font=(None, MON_FONTSIZE)).pack(anchor=tk.W)
tk.Label(count_frame, textvariable=self.label_last, \
font=(None, MON_FONTSIZE)).pack(anchor=tk.W)
tk.Label(count_frame, textvariable=self.label_total, \
font=(None, MON_FONTSIZE)).pack(anchor=tk.W)
self.update_cnt_labels()
然后后來...
''' Get list of Window ID's on monitor now '''
new_windows = self.windows_on_monitor(new_windows)
new_windows_cnt = len(new_windows) / WIN_CNT
if self.old_windows_cnt == new_windows_cnt :
FlashMessage (self.label_this, "No new windows to remove...", \
3, 750, 250)
self.update_cnt_labels()
return
然后后來...
class FlashMessage:
def __init__(self, widget, message, count=5, on=500, off=300):
self.delay_show (1, widget, message)
for i in range(count):
self.delay_show (on, widget, "")
self.delay_show (off, widget, message)
def delay_show(self, ms, widget, message):
root.after(ms, widget.set(message))
root.update_idletasks()
我想避免在最后兩行中使用root
並使用self
或類似的東西。
我的程序調用鏈是這樣的:
root = tk.Tk()
ResizingCanvas(mycanvas)
<ButtonPress-1>
popup(event)
menu.tk_popup(event.x_root, event.y_root)
RemoveNewWindows()
remove()
FlashMessage()
(如上所示)self.delay_show()
(如上所示) 每個類和函數都有隨意的self
、位置參數、 *args
和**kwargs
,它們大多沒有用處。 事實上,甚至上面的__init__
也可能是不必要的。 這是在堆棧溢出時復制代碼的結果。
程序中的每個第二個單詞似乎都是self
但parent
一詞僅用於類ResizingCanvas()
。 我是否必須在調用列表中傳播parent
並以某種方式使用它?
您可以在任何小部件上調用after
和update_idletasks
。 有許多這樣的函數可以在任何小部件上調用,但具有全局效果。
在您的情況下,您需要將一些小部件傳遞到FlashMessage
構造函數並保存引用。 然后,您可以使用引用來調用函數。
您正在傳遞實際上不包含小部件的稱為widget
東西。 您需要將其重命名為更合適的名稱(例如: var
),然后傳入一個實際的小部件。
(注:你也叫after
不正確,我已經固定在下面的例子中)
例如:
class FlashMessage:
def __init__(self, widget, var, message, count=5, on=500, off=300):
self.widget = widget
...
def delay_show(self, ...):
self.widget.after(ms, var.set, message)
self.widget.update_idletasks()
然后,每當您創建FlashMessage
實例時,您都需要添加一個小部件作為第一個參數。
例如,假設count_frame
是在您創建FlashMessage
實例的上下文中定義的,並且它是一個實際的小部件,它可能如下所示:
if self.old_windows_cnt == new_windows_cnt :
FlashMessage (count_frame, self.label_this, "No new windows to remove...", \
3, 750, 250)
self.update_cnt_labels()
return
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.