wxPython, Threads и PostEvent между модулями - PullRequest
1 голос
/ 30 марта 2010

Я относительно новичок в 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() вдоль этих строк . Если бы кто-нибудь мог указать мне правильное направление, это было бы очень ценно.

1 Ответ

2 голосов
/ 30 марта 2010

Самое простое решение - использовать wx.CallAfter

wx.CallAfter(text_control.SetValue, "some_text")

Вы можете вызывать CallAfter из любого потока, и функция, которую вы передаете для вызова, будет вызываться из основного потока.

...