2017-03-13 21 views
0

我有這個在端口上監聽的小程序。我想要實現的是,當來自網絡的數據到達時,它應該將窗口顏色更改爲該數據。我應該如何修改我的代碼?當網絡數據到達時,定期更改窗口顏色

#!/usr/bin/env python 
from Tkinter import Tk 
import time 
import socket 

window = Tk() 
window.geometry("266x208") 
window.title("Claculator") 
window.configure(background='#ffffff') 
window.mainloop() 


TCP_IP = '127.0.0.1' 
TCP_PORT = 5005 
BUFFER_SIZE = 20 # Normally 1024, but we want fast response 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((TCP_IP, TCP_PORT)) 
s.listen(1) 

conn, addr = s.accept() 
print 'Connection address:', addr 
while 1: 
    data = conn.recv(BUFFER_SIZE) 
    if not data: break 
    print "received data:", data #here comes the data color and it should call window color change 
    conn.send(data) # echo 
conn.close() 
+1

這是相當尷尬的。只要窗口保持打開狀態,'window.mainloop()'將無限期地運行。 while 1:'循環只要有更多的數據要接收就會無限期地運行。您通常不能同時運行兩個無限循環。 – Kevin

+1

你嘗試過'.after()'方法嗎? [檢查出來](http://effbot.org/tkinterbook/widget.htm#Tkinter.Widget.after-method)。如果沒有,請嘗試一下。 –

回答

0

你需要一個無限循環的連接,併爲Tkinter的GUI,你不能有2個循環在一個單獨的線程。最好的解決方案是爲其中一個啓動一個新線程。例如:

#!/usr/bin/env python 
from Tkinter import Tk 
import time 
import socket 
import threading 

TCP_IP = '127.0.0.1' 
TCP_PORT = 5005 
BUFFER_SIZE = 20 # Normally 1024, but we want fast response 

class Connection(threading.Thread): 
    def run(self): 
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     s.bind((TCP_IP, TCP_PORT)) 
     s.listen(1) 

     conn, addr = s.accept() 
     print 'Connection address:', addr 
     while 1: 
      data = conn.recv(BUFFER_SIZE) 
      if not data: break 
      print "received data:", data #here comes the data color and it should call window color change 
      self.window.config(background=data) 
      self.window.update() 
      conn.send(data) # echo 
     conn.close() 

window = Tk() 
window.geometry("266x208") 
window.title("Claculator") 
window.configure(background='#ffffff') 
thread = Connection() 
thread.window = window 
thread.start() #start the connection loop 
window.mainloop() #start Tkinter's loop 

(完全未測試)。

+0

謝謝喬納森! – peter

相關問題