私は(まだ)OOPプログラマーではないので、可能であればそのパラダイムを避けてください...
遅かれ早かれ、Python でプログラミングを成功させたいのであれば、オブジェクト指向プログラミングを理解する必要があります。代替手段 (どこにでもあるグローバル変数と関数) は、間違いなく良いアプローチではありません。Tkinter でも、それぞれのメソッドを持つクラスがたくさんあるので、目的に応じて必要なようです。
質問に戻ると、トップレベル ウィンドウをすべてのアプリケーションをラップするクラスの属性として設定し、この属性が None の場合にのみ新しいウィンドウを開くことが解決策になる可能性があります。ウィンドウを閉じるときにこの属性を None に設定するには、protocol
メソッドを使用してコールバックを設定します。
これは、それがどのように機能するかを確認できる小さな実例です。
import Tkinter as tk
class App(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.button = tk.Button(self, text="Open a new window", command=self.openwindow)
self.button.pack()
self.toplevel = None
def openwindow(self):
if self.toplevel is None:
self.toplevel = tk.Toplevel(self)
self.toplevel.protocol('WM_DELETE_WINDOW', self.removewindow)
def removewindow(self):
self.toplevel.destroy()
self.toplevel = None
app = App()
app.mainloop()