2016-09-14 11 views
0

このサイト(および他のもの)を上下に検索しましたが、適切な解決策を見つけることができません。Tkinterスレッドが原因でUIがフリーズする

私は、サーバーに接続し、数秒ごとに自動的にメッセージを送信するクライアントプログラムと、ユーザーコマンドを持っています。私はこれに複数のスレッドを使用しています。 Enter Tkinter:「接続」ボタンを押すと、クライアントがサーバーに接続する際に、接続の試行がタイムアウトするか、または終了するまでUIがフリーズします。

私は、ボタンのコマンドパラメータから、メインループの内側から、そしてメインループの外側からスレッドを呼び出そうとしました。私は、メインループをスレッドに入れて、そこから接続用の新しいスレッドを作成しようとしました。 何も動作していないようです... UIはハングアップし続けます。

class EventSim(Frame): 

    def __init__(self, parent): 
     self.queue = Queue 
     Frame.__init__(self, parent) 

     self.parent = parent 

    def initUI(self,IP_Address,Port_Number,Events_Directory): 
    #... 
    self.Con_Button = Button(frame7,text='Connect', command = lambda: 
     self.connect(IP_Text.get(),Port_Text.get(),)) 

    def connect(self,IP,Port): 
     ConnectionThread = Thread(eventsim.con_thread(IP,Port)) 
     ConnectionThread.start() 


def main(): 
root = Tk() 
root.geometry("300x310+750+300") 
Sim = EventSim(root) 
eventsim.readconfig() 
Sim.initUI(eventsim.ipa,eventsim.portnum,eventsim.event_dir) 
root.mainloop() 
+0

すべてのTkinterの相互作用は、単一のスレッドでする必要があります。 tkinterオブジェクト上のtkinter関数またはメソッドを、ルートウィンドウが作成されたスレッド以外のスレッドから確実に呼び出すことはできません。 –

答えて

1

それはeventsim.con_thread(...)完了が実行されるまで待機しますので、あなたは、eventsim.con_thread(IP,Port)Thread(...)への関数の結果を渡します。変更してみてください:

def connect(self, IP, Port): 
    ConnectionThread = Thread(eventsim.con_thread(IP,Port)) 
    ConnectionThread.start() 

に:

def connect(self, IP, Port): 
    ConnectionThread = Thread(target=lambda ip=IP, port=Port: eventsim.con_thread(ip,port)) 
    ConnectionThread.start() 
+0

それは魅力のように機能します。どうもありがとうございます。私は昨日それを理解しようと何時間も過ごしました。私は実際にラムダのアプローチを試みましたが、このように: ConnectionThread = Thread(target = lambda:eventsim.con_thread(IP、Port)) 私は同じミスをしていると思います。 –

関連する問題