Я думаю, что проблема в том, что вы напрямую вызываете window.plot(data)
из потока, который не является основным потоком / потоком GUI, и ожидаете, что QTimer затем сработает для вызова слот-метода в основном потоке / GUI.
Qt не работает таким образом, однако - если вы хотите, чтобы QTimer
работал в основном потоке, вам нужно создать его в основном потоке.
Вторая проблема заключается в том, чтовы создаете новый QTimer
в каждом вызове window.plot(data)
и настраиваете каждый новый QTimer
на испускание сигнала каждые 20 мс.Таким образом, даже если бы работала функция QTimer
, постоянное накопление десятков / сотен QTimer
объектов, каждый из которых излучал сигнал 50 раз в секунду, быстро привело бы к бесполезности вашей программы.
Мое предложение по исправлениюсоздать только один QTimer
объект (возможно, внутри Window.__init__(self)
), connect()
его в вашем update()
слоте и вызвать start(20)
на нем ровно один раз;этого будет достаточно, чтобы ваш метод self.update()
вызывался с частотой 50 Гц (если позволяет мощность процессора).
Остается только вопрос о том, как безопасно передать полученный data
из сетевого потока в вашОсновная тема.Для этого, вероятно, самый простой способ - создать подкласс QEvent
, который может содержать полученные data
в качестве переменной-члена, и заставить ваш сетевой поток создавать новый объект этого подкласса каждый раз, когда ему нужно отправить data
в основной поток, и вызовите QApplication.postEvent()
с вашим Window
и этим QEvent
-объектом в качестве аргумента.Затем в своем классе Window
переопределите метод event(self, QEvent)
(который вызывается всякий раз, когда ваш объект Window получает любое событие) и добавьте туда логику, чтобы, если аргумент-событие является одним из вашего подкласса события, он захватываетdata
вне события и обрабатывает его.(Критическим преимуществом здесь является то, что event(self, QEvent)
вызывается основным потоком, а не напрямую вашим сетевым потоком, поэтому вы можете безопасно взаимодействовать с объектами основного потока / графического интерфейса из этого контекста)