模块之间的wxPython,Threads和PostEvent

时间:2010-03-30 10:10:26

标签: python user-interface events multithreading wxpython

我对wxPython比较新(但不是Python本身),所以请原谅我,如果我在这里错过了什么。

我正在编写一个GUI应用程序,它在一个非常基本的级别包含启动和停止线程的“开始”和“停止”按钮。该线程是一个无限循环,仅在线程停止时结束。循环生成消息,此时只使用print输出。

GUI类和无限循环(使用threading.Thread作为子类)保存在单独的文件中。让线程将更新推送到GUI中的TextCtrl之类的最佳方法是什么?我一直在玩PostEventQueue,但没有太多运气。

这是一些简单的代码,删除部分以保持简洁:

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()沿these lines使用{{1}}将文章放在同一个文件中。如果有人能指出我正确的方向,那将非常感激。

1 个答案:

答案 0 :(得分:2)

最简单的解决方案是使用wx.CallAfter

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

您可以从任何线程调用CallAfter,并且将从主线程调用您传递它的函数。