Я пытаюсь создать очень простой графический интерфейс wxPython, который отслеживает и отображает внешние данные. Есть кнопка включения / выключения мониторинга. Когда мониторинг включен, графический интерфейс обновляет пару wx StaticLabels с данными в реальном времени. Когда мониторинг отключен, графический интерфейс бездействует.
Способ, которым я пытался его построить, был с довольно простой версией Python Thread. При нажатии кнопки «Начать мониторинг» программа порождает поток, который обновляет метки информацией в реальном времени. При нажатии кнопки «Остановить мониторинг» вызывается thread.join (), и он должен остановиться.
Функция запуска работает, и обновление данных в режиме реального времени работает отлично, но когда я нажимаю «Стоп», вся программа зависает. Я запускаю это на Windows 7 64-битной, так что я получаю обычный диалог Windows «Эта программа перестала отвечать».
Вот соответствующий код:
class MonGUI(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
...
... other code for the GUI here ...
...
# Create the thread that will update the VFO information
self.monThread = Thread(None, target=self.monThreadWork)
self.monThread.daemon = True
self.runThread = False
def monThreadWork(self):
while self.runThread:
...
... Update the StaticLabels with info
... (This part working)
...
# Turn monitoring on/off when the button is pressed.
def OnClick(self, event):
if self.isMonitoring:
self.button.SetLabel("Start Monitoring")
self.isMonitoring = False
self.runThread = False
self.monThread.join()
else:
self.button.SetLabel("Stop Monitoring")
self.isMonitoring = True
# Start the monitor thread!
self.runThread = True
self.monThread.start()
Я уверен, что есть лучший способ сделать это, но я довольно плохо знаком с программированием GUI и потоками Python, и это было первое, что я придумал.
Итак, почему нажатие кнопки, чтобы остановить поток, приводит к зависанию всего этого?