2013-04-20 4 views
25

私は次のようなプログラムを書いています:複数のウィンドウのTkinterサンプルコードですが、ボタンが正しく読み込まれないのはなぜですか?

  1. ボタンを押してウィンドウを開きます。
  2. 別のボタンを押して、新しく開いたウィンドウを閉じます。

クラスを使用しているので、コードを後で大きなプログラムに挿入できます。しかし、ボタンを正しく読み込むことができません。

import tkinter as tk 

class Demo1(tk.Frame): 
    def __init__(self): 
     tk.Frame.__init__(self) 
     self.pack() 
     self.master.title("Demo 1") 
     self.button1 = tk.Button(self, text = "Button 1", width = 25, 
           command = self.new_window) 
     self.button1.grid(row = 0, column = 1, columnspan = 2, sticky = tk.W+tk.E+tk.N+tk.S) 

    def new_window(self): 
     self.newWindow = Demo2() 

class Demo2(tk.Frame): 
    def __init__(self): 
     new = tk.Frame.__init__(self) 
     new = tk.Toplevel(self) 
     new.title("Demo 2") 
     new.button = tk.Button(text = "Button 2", width = 25, 
           command = self.close_window) 
     new.button.pack() 

    def close_window(self): 
     self.destroy() 

def main(): 
    Demo1().mainloop() 

if __name__ == '__main__': 
    main() 

答えて

33

私はより組織、より良い練習方法でコードを書き直しました:

import tkinter as tk 

class Demo1: 
    def __init__(self, master): 
     self.master = master 
     self.frame = tk.Frame(self.master) 
     self.button1 = tk.Button(self.frame, text = 'New Window', width = 25, command = self.new_window) 
     self.button1.pack() 
     self.frame.pack() 

    def new_window(self): 
     self.newWindow = tk.Toplevel(self.master) 
     self.app = Demo2(self.newWindow) 

class Demo2: 
    def __init__(self, master): 
     self.master = master 
     self.frame = tk.Frame(self.master) 
     self.quitButton = tk.Button(self.frame, text = 'Quit', width = 25, command = self.close_windows) 
     self.quitButton.pack() 
     self.frame.pack() 

    def close_windows(self): 
     self.master.destroy() 

def main(): 
    root = tk.Tk() 
    app = Demo1(root) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

結果:それが依存

Demo1 windowDemo2 window

+0

@ADBを。一般に、2つの 'Tk()'ウィンドウ上で2つの 'mainloop()'を実行すると、下が見えます。しかし、複数のウィンドウが必要な場合は、2つの 'mainloop()'を避けることができます。したがって、 'Tople()'ウィジェットは 'Tk()'と似ています。 –

+7

2つのメインループは何にも「依存」せず、単に「見下された」だけではなく、間違っています。あなたは1つだけ必要です。 mainloopへの呼び出しは無限ループです。無限ループ内で無限ループを複数回実行すると、無限ループになります。あなたのコード(Demo1.new_window内)で 'mainloop'への2回目の呼び出しを削除する必要があります。そうしないと、Tkinterの使い方を習得しようとしている人が混乱します。 –

+0

'close_windows()'について説明できますか?いつ呼び出さなければならないのですか? – sbhatla

9

2番目のボタンのマスターを指定する必要があります。それ以外の場合は、最初のウィンドウにパックされます。これは、Buttonだけでなく、StringVarなどの他のウィジェットやGUI以外のオブジェクトにも必要です。

クイックフィックス:Demo2であなたのButtonの最初の引数としてフレームnewを追加します。

おそらくより良い:現在、あなたはDemo2tk.Frameから継承しているが、私は、これはあなただけの提案として、このようなもの、

class Demo2(tk.Toplevel):  
    def __init__(self): 
     tk.Toplevel.__init__(self) 
     self.title("Demo 2") 
     self.button = tk.Button(self, text="Button 2", # specified self as master 
           width=25, command=self.close_window) 
     self.button.pack() 

    def close_window(self): 
     self.destroy() 

するDemo2を変更した場合、あなただけtkinterをインポートする必要があり、より理にかなっていると思います一度。最初の2つのインポートステートメントの1つを選択します。

2
#!/usr/bin/env python 
import Tkinter as tk 

from Tkinter import * 

class windowclass(): 

     def __init__(self,master): 
       self.master = master 
       self.frame = tk.Frame(master) 
       self.lbl = Label(master , text = "Label") 
       self.lbl.pack() 
       self.btn = Button(master , text = "Button" , command = self.command) 
       self.btn.pack() 
       self.frame.pack() 

     def command(self): 
       print 'Button is pressed!' 

       self.newWindow = tk.Toplevel(self.master) 
       self.app = windowclass1(self.newWindow) 

class windowclass1(): 

     def __init__(self , master): 
       self.master = master 
       self.frame = tk.Frame(master) 
       master.title("a") 
       self.quitButton = tk.Button(self.frame, text = 'Quit', width = 25 , command = self.close_window) 
       self.quitButton.pack() 
       self.frame.pack() 


     def close_window(self): 
       self.master.destroy() 


root = Tk() 

root.title("window") 

root.geometry("350x50") 

cls = windowclass(root) 

root.mainloop() 
関連する問題