2016-09-10 7 views
1

Tkinter GUIから値を受け取って別のコンピュータにソケットから送信する目的のプログラムを作成しました。TkinterとSocketを並行して使用する方法

問題は、Tkinterがすべてのループをホッグすることです。私はroot.after()を使ってみましたが、ソケットのものは.get()関数に依存していますので、GUIがまだ出現していないので呼び出されたときに、送信しようとしているものの値はありません。ここで

は、どのように私はループの中で、これがすべて実行されていない

HOST= 'ip address' 
PORT = 8000 
s= socket(AF_INET, SOCK_STREAM) 
s.bind((HOST, PORT)) 
s.listen(1) #I'm aiming for this to eventually be 24. 
conn, addr = s.accept 

def data(): 
    Value = str(value.get()) 
    conn.sendall(str(Value)) 

root = Tk() 
value = Scale(root, from_=255, to=0) 
value.set(60) 
value.pack() #not using pack but grid. Pack is just easier for simple example. 

root.after(500, data()) 
root.mainloop() 

(私は、よく、約10の異なる変数が大きくはるかに大きい)私は何をしようとしているのがより簡単なコード例ですか?変更が行われたときにデータを送信しますか? (うまくいけば毎秒、私が目指しているものです)。私はroot.mainloopの前にroot.afterを持っている問題を理解していますが、そうでない場合は動作しません。とにかく、他の方法では動作しません。

私はスレッドとキューが唯一の解決策かもしれないと思っていますが、私はいつもそれらのモジュールで苦労しています。

GUIスライドの変更に合わせて常に両方のプログラムコンポーネントをループして常にデータを送信する必要があります。

+1

[あなた自身のコードをTkinterのイベントループとともにどのように実行しますか?](http://stackoverflow.com/questions/459083/how-do-you-run-your-own-code-alongside-tkinters -event-loop) – msw

+0

うまく表示されます。重複する質問から欠落しているビットは、 'data()'が関数終了時に自身を再スケジュールすることです。 – msw

+0

もう片方がtkinterを使用してから残りのプログラムのためにそれを抜け出すので、重複はありません。私は実際にそこから関数を得ました。私は絶えず更新が必要です。 –

答えて

0

あなたの根本的な問題は、root.after(500, data())dataNone)の呼び出し結果を呼び出すようにtkをスケジュールすることです。代わりに関数を渡す必要があります:root.after(500, data)。定期的に送信するには、conn.sendallコール後に、同じ行をdataの末尾に追加します。値が変更されたときにのみ送信するには、 '古い'値を保存して比較する必要があります。これらの変更は次のとおりです。

from tkinter import * 

oldvalue = 60 
interval = 500 

def data(): 
    global oldvalue 
    newvalue = str(value.get()) 
    if newvalue != oldvalue: 
     print(newvalue) 
     oldvalue = newvalue 
    root.after(interval, data) 

root = Tk() 
value = Scale(root, from_=255, to=0) 
value.set(oldvalue) 
value.pack() #not using pack but grid. Pack is just easier for simple example. 

root.after(1, data) 
root.mainloop() 

send用スタンドインとしてprintを使用すると、はるかに簡単にGUIの実験を作ることに注意してください。そのようにすると、スライダを移動している間に中間値が送信されます。これがあなたが望むものでなければ、あなたはもっと実験するでしょう。 afterを使用する代わりに、'<ButtonRelease-1>' toデータをバインドします。またはポーリングし、同じ値を2回取得するときにのみ送信します。または何でも。

関連する問題