2016-08-30 10 views
1

私のGUIに最初のものと全く同じ '新しいウィンドウ'オプションを持たせたい。Tkinter新しいウィンドウが適切に閉じない

問題は、新しいウィンドウを開いてからボタンを押すたびに、最初のクリックで何も起こらず、2番目の操作では何も起こらない、終了(終了)ボタンがあることです。両方のウィンドウを閉じます(3つのウィンドウが開いているので、3回目のクリックをすべて終了します)。

この関連するコード:

from Tkinter import * 
from ttk import * 


class Application(Tk): 
    def __init__(self): 
     self.root = Tk() 
     self.root.geometry("250x150") 
     self.app = Frame(self.root) 
     self.app.grid() 
     self.create_menu() 
     self.create_widgets() 
     self.root.mainloop() 

    def create_menu(self): 
     menu = Menu(self.root) 
     self.root.config(menu=menu) 
     sub_menu = Menu(menu) 
     menu.add_cascade(label="File", menu=sub_menu) 
     sub_menu.add_command(label="New", command=self.__init__) 
     sub_menu.add_command(label="Run", command=self.enter) 
     sub_menu.add_separator() 
     sub_menu.add_command(label="Exit", command=self.app.quit) 

私も変更しようとしました:

sub_menu.add_command(label="New", command=self.__init__) 

へ:

sub_menu.add_command(label="New", command=self.new window) 

def new_window(self): 
    class App(Application): 
     Application.__init__(self) 

どちらも同じことです。

どうすれば修正できますか?

答えて

1

Tkinterアプリケーションでは、1つのTkオブジェクトしか存在しません。オブジェクトがガベージコレクタによって破棄または破棄された場合、Tkinterは無効になります。代わりに他のウィンドウにはToplevelを使用してください。

は、代わりにこれを試してみてください:

from Tkinter import * 
from ttk import * 


class Application(object): 
    def __init__(self, master): 
     self.root = master 
     self.root.geometry("250x150") 
     self.app = Frame(self.root) 
     self.app.grid() 
     self.create_menu() 
     self.create_widgets() 

    def create_menu(self): 
     menu = Menu(self.root) 
     self.root.config(menu=menu) 
     sub_menu = Menu(menu) 
     menu.add_cascade(label="File", menu=sub_menu) 
     sub_menu.add_command(label="New", command=self.new) 
     sub_menu.add_command(label="Run", command=self.enter) 
     sub_menu.add_separator() 
     sub_menu.add_command(label="Exit", command=self.quit) 

    def new(self): 
     window = Toplevel(tk) 
     return Application(window) 

    def quit(self): 
     tk.destroy() 

tk = Tk() 
Application(tk) 
tk.mainloop() 
+0

_「オブジェクトが逆参照されている場合はTkinterが無効になります」_ - それは完全に真の文ではありません。逆参照することはできますが、破壊することはできません。またはガベージコレクタに破棄させることはできません。 'Tk'インスタンスがグローバルスコープ内に存在する場合、それは破壊されずに逆参照することができます。 –

関連する問題