Search code examples
socketspython-2.7wxpythonpython-multithreading

Why does it take so long for background color to change?


I am running into a problem with a simple program that changes the color of the background when it receives a command from a different machine through TCP. It takes like thirty seconds to change the color. I am running this through the local network so it should be near instant response. I am using wxPython for the frame. I don't think I have overly complicated code. Relevant code:

    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()

I need this code to be instant as this will be going on a robot that will tell if objects are too close(which is why there is red background when it gets within 20 cm of object). Any help will be greatly appreciated!


Solution

  • It appears that you are attempting to update wxPython code from a thread. This action is unsupported / undefined in wxPython. You need to use thread-safe methods to update the wxPython UI, such as wx.CallAfter or wx.PostEvent. See the following wxPython wiki page for some examples:

    Basically, you'll want to do something like this in your if statements:

    wx.CallAfter(self.bottom_right.SetBackgroundColour, "red")