簡體   English   中英

攔截關閉窗口按鈕(Tkinter窗口)會引發Tcl錯誤

[英]Intercepting the close window button (Tkinter window) throws an Tcl error

我有一個程序,該程序有時會打開一個新窗口(由按鈕和Gizmo填充,供用戶選擇和播放),其定義如下:

def window(self,master):
  def close(self):
    # change some variables
    self.destroy()
  top = self.top = Toplevel()
  # Several lines of buttons
  top.lift()
  top.protocol("WM_DELETE_WINDOW",close(self))

我最初在那里有一個關閉按鈕,可以很好地包裝所有內容,但是我注意到,如果用戶在窗口的角落使用標准的“ X”,則顯然不會調用此函數,此后會出現很多問題。 我從該網站上的其他問題中發現了有關“ WM_DELETE_WINDOW”建議的信息,但這給了我一個很奇怪的錯誤:

  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1630, in wm_protocol
    'wm', 'protocol', self._w, name, command)
TclError: bad window path name ".33862072"

我認為它以某種方式獲得了錯誤的窗口ID,並且無法捕獲事件。 因此,我的問題是,是否正確,其次我應該如何繼續處理這個問題。

讓我們檢查一下這行代碼:

top.protocol("WM_DELETE_WINDOW",close(self))

這行代碼說“立即調用函數close(self) ,並將結果分配給協議處理程序。看到問題了嗎?它可能立即調用close ,可能在self完全構建之前。您不希望函數被稱為 ,您想傳遞對該函數的引用

close作為self一種方法(而不是嵌入式函數),並將對top.protocol的調用top.protocol為如下所示(請注意,缺少結尾括號):

top.protocol("WM_DELETE_WINDOW", self.close)

如果您希望保留嵌套函數,則可以使用lambda:

top.protocol("WM_DELETE_WINDOW", lambda window=self: close(window))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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