簡體   English   中英

Tkinter的。 如何在頂級窗口等待變量時銷毀根窗口

[英]Tkinter. How to destroy the root window while top level window is waiting for a variable

我有一個問題,用戶可以通過其中的wait_variable()方法打開top_level窗口來等待變量。 但是當top_level窗口打開時, root窗口仍然可見,並且用戶可以通過常規方法關閉root窗口(這是有意的)。 我想要的(以及某種期望.destroy()可以做的)是在root窗口上調用.destroy().quit()將導致root的所有子級都終止。 但是似乎正在發生的事情是top_level窗口仍然停留在其本地事件循環中,並且只有在其父項消失后才能通過任務管理器殺死。

那我在做什么錯? 在本地事件循環中,如何獲取top_level窗口以偵聽其父項破壞?

下面是一些示例代碼,演示了此問題。 如果您運行代碼並按照下面的步驟操作,IDE將崩潰! 可能,所以省去您的工作。 按下根目錄中的“ Click按鈕。 出現頂級窗口,並帶有另一個顯示Test按鈕。 現在關閉root窗口。 IDE將掛起。

import tkinter
root = tkinter.Tk()
def toplevel(event=None):
    def set1(event=None):
        vr.set(1)
    tp = tkinter.Toplevel(root)
    vr = tkinter.IntVar()
    bt_ = tkinter.Button(tp,text='Test',command=set1)
    bt_.grid()
    tp.wait_variable(vr)
    tp.destroy()
bt = tkinter.Button(root,text='Click',command=toplevel)
bt.grid()
root.mainloop()

編輯:我當前的解決方案是在top_level窗口啟動時將WM_DELETE_WINDOW協議指向一個函數,該函數設置本地事件循環正在等待的變量,然后銷毀root窗口。

IMO的正確解決方案是不要等待變量,而要等待窗口。 然后,您的按鈕必須承擔銷毀窗口的責任,而不是設置變量或除了設置變量之外。

這是正確的解決方案,還有另一個原因:如所編寫的,如果用戶使用標題欄中的按鈕破壞了頂層,則程序也會掛起。 由於您正在等待變量,因此窗口被破壞了,因此永遠不會設置該變量。

(您在編輯中建議的解決方案也是有效的-在銷毀窗口時在頂層注冊WM_DELETE_WINDOW來設置變量。效果是相同的)。

暫無
暫無

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

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