簡體   English   中英

在 Python 中使用 Tkinter 退出時的消息框對話框

[英]Message Box Dialog at Exit using Tkinter in Python

我想在按下“X”按鈕關閉 GUI 時顯示一個消息框對話框。 我想問用戶他是否確定他想用是/否選擇退出程序。 在對話框中按“是”時出現錯誤,如果按“否”則 GUI 關閉。 這是完整的代碼

這是我得到的錯誤:

self.tk.call('destroy', self._w)

_tkinter.TclError:無法調用“destroy”命令:應用程序已被銷毀

這是我到目前為止所做的:

import atexit

def deleteme():
     result = messagebox.askquestion("Exit", "Are You Sure You Want to Exit?")
     if result == "yes":
        root.destroy()
     else:
        return None

atexit.register(deleteme)

您可以使用protocol方法將 window 刪除與 function 綁定。

from tkinter import *
from tkinter import messagebox

def on_close():
    response=messagebox.askyesno('Exit','Are you sure you want to exit?')
    if response:
        root.destroy()

root=Tk()
root.protocol('WM_DELETE_WINDOW',on_close)

root.mainloop()

更新

根據atexit模塊的文檔

這樣注冊的函數會在解釋器正常終止時自動執行。

注冊的mainloop在主循環被破壞后被調用(因為沒有任何進展,它標志着程序的結束)。 function 試圖破壞的 GUI 元素不再存在,如錯誤所述。

該模塊不適用於您嘗試實現的用例,它通常用於應該在程序終止后執行任務的“清理”功能。

通過WM_DELETE_WINDOW協議注冊的回調使您可以控制 window 被指示關閉時發生的情況。

只是添加到@AST的答案:

當程序嘗試退出時,您正在嘗試使用atexit庫來阻止關閉 tkinter window。 問題是atexit庫在 window 被銷毀后調用您的 function 。 我什至不認為您可以使用atexit阻止程序退出。 這就是為什么@AST 建議使用在 tkinter window 試圖關閉時運行的root.protocol("WM_DELETE_WINDOW", on_close) (僅在用戶按下“X”按鈕時有效)。

暫無
暫無

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

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