Почему так долго меняется цвет фона?

У меня возникла проблема с простой программой, которая меняет цвет фона, когда получает команду с другой машины через TCP. Изменение цвета занимает около тридцати секунд. Я запускаю это через локальную сеть, поэтому ответ должен быть почти мгновенным. Я использую wxPython для фрейма. Я не думаю, что у меня слишком сложный код. Соответствующий код:

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

Мне нужно, чтобы этот код был мгновенным, так как это будет происходить на роботе, который сообщит, находятся ли объекты слишком близко (поэтому появляется красный фон, когда он находится в пределах 20 см от объекта). Любая помощь будет оценена!


person user3818089    schedule 18.01.2015    source источник


Ответы (1)


Похоже, вы пытаетесь обновить код wxPython из потока. Это действие не поддерживается/не определено в wxPython. Для обновления пользовательского интерфейса wxPython необходимо использовать потокобезопасные методы, такие как wx.CallAfter или wx.PostEvent. См. следующую вики-страницу wxPython для некоторых примеров:

По сути, вы захотите сделать что-то подобное в своих операторах if:

wx.CallAfter(self.bottom_right.SetBackgroundColour, "red")
person Mike Driscoll    schedule 19.01.2015
comment
Кроме того, в некоторых случаях может показаться, что задний фон не был изменен до тех пор, пока окно не будет перерисовано, поэтому, если вышеперечисленное не помогает, вы можете переместить SetBackgroundColour в новый метод, который также вызывает Refresh, а затем вызовите это новый метод через wx.CallAfter. - person RobinDunn; 19.01.2015
comment
Хорошая точка зрения. Я должен был упомянуть метод Refresh(). - person Mike Driscoll; 19.01.2015