2017-04-18 677 views
0

在我的脚本中,我有时会打电话给我的ErrorWindow类以显示错误消息。这将创建一个空的tkinter窗口和一个messagebox错误窗口。我或者只想要messagebox窗口,或者我想让tkinter窗口在关闭错误窗口时自动关闭。 我试了两件代码:关闭tkinter窗口以及messagebox错误窗口

class ErrorWindow: 
    def __init__(self,error_message): 
     self.error_window = tk.Tk() 
     messagebox.showerror("ERROR",error_message,command=self.close) 
     self.error_window.protocol("WM_DELETE_WINDOW", self.close) 
     self.error_window.mainloop() 

    def close(self): 
     self.error_window.destroy() 

class ErrorWindow: 
    def __init__(self,error_message): 

     messagebox.showerror("ERROR",error_message) #automatically creates a tk window too 

不过,即使有第二个,tkinter窗口保持后我关闭messagebox

我如何编程类,这样我只需要按下一个按钮(或者Ok或在窗口右上方的X)一次,关闭所有窗口(这是否是一个或两个)?

回答

1

您需要withdraw主窗口:

class ErrorWindow: 
    def __init__(self,error_message): 
     if not tk._default_root: # check for existing Tk instance 
      error_window = tk.Tk() 
      error_window.withdraw() 
     messagebox.showerror("ERROR",error_message) 

这没有业务的一类。你应该重做这个简单的功能。

+0

你还需要记住要摧毁它,或者每次调用一个新窗口时创建另一个和另一个... –

+0

好点;编辑。 – Novel

0

您没有指定是否只有一个地方或多个地方您可能想要一条错误消息。如果是后者,你可以创建和撤销一次tk窗口。我相信一个包装函数而不是类应该足以满足您的需求。

import tkinter as tk 
from tkinter import messagebox 

root = tk.Tk() 
# consider placing root to control where messagebox appears 
root.withdraw() 

def showerror(message): 
    messagebox.showerror('XYZ ERROR', message, parent=root) 

为了避免可能出现的问题,我总是用一个明确的masterparent的一切,从不依靠_default_root

+0

因此,这将在整个程序期间保持打开tkinter窗口,这反过来又是每个打开的错误消息的父窗口。 – RnRoger

+0

@RRroger我不确定'open'是什么意思,但是,它会在整个程序中保留未显示的,不可见的Tk *对象*,并可用作主和子部件。 IDLE目前以这种方式工作:撤销的根Tk实例是可见Toplevel实例的主人。 –