Я относительно новичок в wxPython (но не в самом Python), поэтому прости меня, если я что-то здесь упустил.
Я пишу приложение с графическим интерфейсом, которое на базовом уровне состоит из кнопок «Пуск» и «Стоп», которые запускают и останавливают поток. Этот поток представляет собой бесконечный цикл, который заканчивается только тогда, когда поток остановлен. Цикл генерирует сообщения, которые на данный момент просто выводятся с использованием print
.
Класс GUI и бесконечный цикл (с использованием threading.Thread
в качестве подкласса) хранятся в отдельных файлах. Каков наилучший способ заставить поток выдвинуть обновление на что-то вроде TextCtrl
в графическом интерфейсе? Я играл с PostEvent
и Queue
, но без особой удачи.
Вот небольшой код с удаленными частями для краткости:
main_frame.py
import wx
from loop import Loop
class MainFrame(wx.Frame):
def __init__(self, parent, title):
# Initialise and show GUI
# Add two buttons, btnStart and btnStop
# Bind the two buttons to the following two methods
self.threads = []
def onStart(self):
x = Loop()
x.start()
self.threads.append(x)
def onStop(self):
for t in self.threads:
t.stop()
loop.py
class Loop(threading.Thread):
def __init__(self):
self._stop = threading.Event()
def run(self):
while not self._stop.isSet():
print datetime.date.today()
def stop(self):
self._stop.set()
В какой-то момент я сделал так, чтобы классы были в одном и том же файле, используя wx.lib.newevent.NewEvent()
вдоль этих строк . Если бы кто-нибудь мог указать мне правильное направление, это было бы очень ценно.