2016-12-20 9 views
1

私はtkinterアプリケーション(tkinter 8.6、python 3.5、ubuntu xenial)で余分なウィンドウをいくつか動かしたいと思います。私はメインアプリケーションから削除ウィンドウプロトコルOKをピックアップすることができますが、追加のwindowsで呼び出されることはありません。ユーザーが 'X'でウィンドウを閉じるようにしたいのですが、これをいつ行うのかを知る必要があります。tkinterプロトコルWM_DELETE_WINDOWが余分なウィンドウで動作しない

私はそれを見ると答えがうつ病になることが予想されます!

この単純なテストアプリケーションを示してい.....

#!/usr/bin/python3 

import tkinter 

class app(tkinter.Tk): 
    def __init__(self): 
     super().__init__() 
     self.child1 = None 
     self.geometry('600x400') 
     w = tkinter.Button(self, command=self.bclick, text='button1') 
     w.pack() 
     self.protocol("WM_DELETE_WINDOW", self.appClose) 

    def bclick(self): 
     if self.child1 == None: 
      self.child1 = tkinter.Toplevel() 
     else: 
      self.child1.destroy() 
      self.child1 = None 

    def appClose(self): 
     print('main app close') 
     self.destroy() 

class wind1(tkinter.Toplevel): 
    def __init__(self): 
     super().__init__() 
     self.title('window 1') 
     self.protocol("WM_DELETE_WINDOW", self.window1Close) 
     self.geometry('600x400') 

    def window1Close(self): 
     print("window1Close") 
     self.destroy() 

if __name__=="__main__": 
    print(tkinter.TkVersion) 
    app().mainloop() 

答えて

3

あなたが正しいです:あなたはそれを見たとき、情けない明らかになるだろう。悪い知らせをして申し訳ありません。

ボタンをクリックすると、あなたがtkinter.Toplevelのインスタンスを作成し、あなたはwind1のインスタンスを作成しないありません。総称Toplevelを取得しているため、WM_DELETE_WINDOWへのバインディングはありません。

+0

実際、私はしばらくしてから盲目的に見えます。今私はちょうどなぜ私の元のプログラムが(このミニの例ではなく)失敗するかを考え出すために行ってきました。 – pootle

関連する問題