我对wxPython比较新(但不是Python本身),所以请原谅我,如果我在这里错过了什么。
我正在编写一个GUI应用程序,它在一个非常基本的级别包含启动和停止线程的“开始”和“停止”按钮。该线程是一个无限循环,仅在线程停止时结束。循环生成消息,此时只使用print
输出。
GUI类和无限循环(使用threading.Thread
作为子类)保存在单独的文件中。让线程将更新推送到GUI中的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()
沿these lines使用{{1}}将文章放在同一个文件中。如果有人能指出我正确的方向,那将非常感激。
答案 0 :(得分:2)
最简单的解决方案是使用wx.CallAfter
wx.CallAfter(text_control.SetValue, "some_text")
您可以从任何线程调用CallAfter
,并且将从主线程调用您传递它的函数。