2012-03-09 37 views
1

はどのよう は、二つのウィンドウ(appapp2)のみapp.mainloop()が呼ばれる生産tkinter.Frame
のサブクラスの__init__master = Tk()を追加していますか?Tkの2つのインスタンスを1つのメインループで作成するにはどうすればよいですか?

from tkinter import Frame,Button,Tk 

class Application(Frame): 

    def say_hi(self): 
     print('Hello world?!') 

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

    def createWidgets(self): 
     self.quit_b = Button(self, width=12, text='Quit', bg='tan', 
        command=self.close) 
     self.quit_b.grid(row=0, column=0, padx=8, pady=8) 

     self.hello_b = Button(self, width=12, text='Hello', 
        command=self.say_hi) 
     self.hello_b.grid(row=0, column=1, padx=8, pady=8) 

    def __init__(self): 
     master = Tk() # <------------------------ ! see here ! 
     Frame.__init__(self, master) 
     self.grid() 
     self.createWidgets() 


app = Application() 
app.master.title('Hello world!') 

app2 = Application() 
app2.master.title('Hello world! 2') 

app.mainloop() 

答えて

2

あなたはクラスTkの2つのインスタンスを作成することはできません、それは別のクラスの__init__以内にそれをインスタンス化するために、やや珍しいです。あなたのコードはうまくいくはずですが、私はそのようには見たことがありません。

他のウィジェットを作成する前に、Tkのインスタンスを作成する必要があります。主なアプリはFrameのサブクラスなので、Tkinterを初期化する前に部分的にFrameのインスタンスを作成していますが、これは単に行うべきではありません。それはうまくいくかもしれませんが、その動作は未定義です。

from Tkinter import tk 
class Application(tk.Tk): 
    ... 

app = Application(...) 
app.mainloop() 

OR、グローバルスコープでTkのインスタンスを作成し、あなたの他のウィジェットに引数として渡す:

代わりに、それはTkののサブクラスとして、あなたのアプリケーションを作成するために、一般的に良いでしょう

from Tkinter import tk 
class Application(tkFrame): 
    ... 
root = tk.Tk() 
myframe = Application(root) 
root.mainloop() 

複数のウィンドウが必要な場合は、Toplevelクラスで追加のウィンドウを作成します。

+0

@HonestAbe: 'Application'のコンストラクタに' Tk'のインスタンスを作成し、 'Application'の2つのインスタンスを作成したので、Tkinterの2つのインスタンスが得られます。単にそれを行う理由はなく、予期せぬ結果が出ます(明らかに、起こっていることはあなたが期待するものではないためです)。 –

+0

質問を少しきれいにして、この回答についての私の古いコメントを削除しました。この答えを編集して、「Tkクラスのインスタンスを2つ作成することはできません...」と明記してください。 'app2'の' master = Tk() 'が' app'で作成されたものを置き換えると言っていますか?そして、あなたはなぜapp.mainloop()が両方のために働くのか説明できますか?ありがとう! –

+0

@HonestAbe: 'mainloop'はウィンドウを作成しません。単純なイベントループです。 'Tk()'を呼び出すたびにウィンドウを作成し、tkサブシステムを初期化します。この初期化は、1つのアプリケーションに対して2回行われるようには設計されていません。 –

関連する問題