2010-12-29 12 views
0

スレッドを使用してtkinterウィンドウインスタンスを作成すると、実行後にウィンドウが破棄されてスレッドが結合されても、私は後でプログラムフローで別のtkinterウィンドウを作ることができません。どうして?tkinterスレッドguiインスタンスは、すべてのさらなるスポーンを停止します

def on_button_click(root): //destroys window on button click 
    root.destroy() 

def init(): //thread calls this 
    root=Tk() 
    b = Button(root, text="OK", command=lambda:on_button_click(root)) 
    b.pack() 
    root.mainloop() 

t = Thread(target=init) 
t.start() 
t.join() 

root=Tk() //program flow halts here with no window being displayed 
root.mainloop() 

答えて

1

私はGoogleの-FOOを使用して収集することができるものから、問題は(root.mainloop()への通話中に作成された)Tkのイベントループは、シングルスレッド化され、あなたが唯一できることです一度に1つのインスタンスがあります。だからそれはおそらく、その場所で立ち往生している理由です。あなたのスレッドはTkサブシステムを適切に設定していますが、同時に実行する2つ目のTkサブシステムを作成しようとするとプログラムが失敗します。 root.destroy()への電話は、作成したウィンドウのみを破壊し、Tkサブシステム全体は破壊しません。

私はTkを使ってからしばらくしていましたが、最初にプログラムを起動した後に、Tkサブシステム全体ではなくTkウィンドウのみをインスタンス化するためにroot.mainloop()を呼び出すことをおすすめします。