簡體   English   中英

Python Tkinter 避免在低級函數中使用“root”名稱

[英]Python Tkinter Avoid using "root" name in lower level function

受到 300 多票已結束問答的啟發: 構建 tkinter 應用程序的最佳方式? ,我希望避免在類中的函數中顯式使用root 我認為它應該通過selfparent或類似的東西隱式聲明。 這是有問題的代碼:

我有這個代碼...

        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__也可能是不必要的。 這是在堆棧溢出時復制代碼的結果。

程序中的每個第二個單詞似乎都是selfparent一詞僅用於類ResizingCanvas() 我是否必須在調用列表中傳播parent並以某種方式使用它?

您可以在任何小部件上調用afterupdate_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM