2017-04-18 35 views
0

私のスクリプトでは、エラーメッセージを表示するために私のErrorWindowクラスを呼び出すことがあります。空のtkinterウィンドウとmessageboxエラーウィンドウが作成されます。 messageboxウィンドウが必要な場合のみ、またはエラーウィンドウを閉じるときにtkinterウィンドウが自動的に閉じるようにします。 私は2つのコードを試しました:メッセージボックスエラーウィンドウと一緒にtkinterウィンドウを閉じる

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() 

私はmessageboxを閉じた後

class ErrorWindow: 
    def __init__(self,error_message): 

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

しかし、たとえ秒1と、tkinterウィンドウが残っています。

すべてのウィンドウを閉じるには、ボタンを1回(ウィンドウの右上にある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

エラーメッセージを表示する場所が1か所か複数かを指定していません。後者の場合、tkウィンドウを1回だけ作成して取り消すことができます。私はクラスではなくラッパー関数があなたの目的にとって十分であるべきだと信じています。可能性の問題を回避するために

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) 

は、私は常に、すべての明示的なmasterまたはparentを使用して_default_rootに依存することはありません。

+0

これは、プログラム全体の間、tkinterウィンドウを開いたままにします。これは、開かれた各エラーメッセージの親ですか? – RnRoger

+0

@RnRoger私はあなたが 'open'によって何を意味するのかは分かりませんが、プログラム全体で非表示、非表示、Tk *オブジェクト*を保持し、マスターと親ウィジェットとして利用できます。 IDLEは現在、この方法で動作します。取り出されたルートTkインスタンスは、可視のToplevelインスタンスのマスターです。 –

関連する問題