2015-01-18 3 views
0

TCP를 통해 다른 컴퓨터에서 명령을 받으면 배경색을 변경하는 간단한 프로그램에 문제가 있습니다. 창 위로 마우스를 움직일 때만 배경이 업데이트됩니다. 로컬 네트워크를 통해이를 실행하고 있으므로 즉시 대응해야합니다. 프레임에 wxPython을 사용하고 있습니다. 지나치게 복잡한 코드가 있다고 생각하지 않습니다. 관련 코드 :이 객체가 너무 가까이있는 경우 알려드립니다 로봇에 갈 것 같은wxPython TxtCtrl 상자 배경이 업데이트되지 않습니까?

threader=threading.Thread(target=self.threading) 
    threader.start() 
def threading(self): 
    host="192.168.1.122" 
    port=4100 
    s=socket.socket() 
    s.bind((host,port)) 
    s.listen(1) 
    c,addr=s.accept() 
    print "Connected" 
    while 1: 
     data=c.recv(1024) 
     if not data: 
      break 
     data=data.split("_") 
     reading=int(data[1]) 
     pin=int(data[0]) 
     if pin == 1: 
      if reading<20: 
       self.front_left.SetBackgroundColour("red") 
     elif pin == 2: 
      if reading<20: 
       self.front_right.SetBackgroundColour("red") 
     elif pin == 3: 
      if reading<20: 
       self.bottom_left.SetBackgroundColour("red") 
     elif pin == 4: 
      if reading<20: 
       self.bottom_right.SetBackgroundColour("red") 
     else: 
      pass 
    c.close() 

나는 즉시로이 코드가 필요합니다 (이는이 개체의 20cm 이내에 도착 빨간색 배경이 이유) . 어떤 도움이라도 대단히 감사하겠습니다!

답변

2

wx 함수를 다른 스레드라고하지 않는 것이 좋습니다. 모든 UI를 메인 스레드에 유지하고 어떻게 든 통신하십시오. 나는 유사한 목적을 위해 이벤트를 사용, 그래서 아마 메인 스레드에서,

self.Bind(lib.BarCode.EVT_MY_OWN, self.OnMyOwn) 

(MyOwnEvent, EVT_MY_OWN) = wx.lib.newevent.NewEvent() 

핸들을 내 자신의 이벤트를 정의하고 TCP

wx.PostEvent(main_window, MyOwnEvent()) 
을 처리하는 스레드에서 호출 것

작업을 단순화하려면 wx.CallAfter를 사용하여 색상을 설정 한 다음 새로 고침하면됩니다.

+2

[wxPython wiki [(http://wiki.wxpython.org/MainLoopAsThread)] 명시 적으로 GUI가 메인 스레드에서만 호출 될 수 있다고 명시되어 있습니다. 그렇지 않으면 스레드 안전 방식을 사용해야합니다. 특정 경우에''wx.CallAfter''가 가장 간단하고 최선의 접근 방식이 될 것입니다. – nepix32

관련 문제