模块之间的wxPython、线程和PostEvent
我对wxPython比较陌生(但不是Python本身),所以如果我错过了一些东西,请原谅 我正在编写一个GUI应用程序,它在一个非常基本的级别上由启动和停止线程的“开始”和“停止”按钮组成。这个线程是一个无限循环,只有当线程停止时才会结束。循环生成消息,此时仅使用模块之间的wxPython、线程和PostEvent,python,user-interface,events,multithreading,wxpython,Python,User Interface,Events,Multithreading,Wxpython,我对wxPython比较陌生(但不是Python本身),所以如果我错过了一些东西,请原谅 我正在编写一个GUI应用程序,它在一个非常基本的级别上由启动和停止线程的“开始”和“停止”按钮组成。这个线程是一个无限循环,只有当线程停止时才会结束。循环生成消息,此时仅使用print输出消息 GUI类和无限循环(使用threading.Thread作为子类)保存在单独的文件中。让线程将更新推送到GUI中的TextCtrl之类的东西的最佳方法是什么?我一直在玩PostEvent和Queue,但运气不好 下面
print
输出消息
GUI类和无限循环(使用threading.Thread
作为子类)保存在单独的文件中。让线程将更新推送到GUI中的TextCtrl
之类的东西的最佳方法是什么?我一直在玩PostEvent
和Queue
,但运气不好
下面是一些简单的代码,删除了部分以保持简洁:
主框架.py
loop.py
我曾经通过使用
wx.lib.newevent.newevent()
将这些类放在同一个文件中,使其工作。如果有人能给我指出正确的方向,我将不胜感激。最简单的解决方案是使用
您可以从任何线程调用
CallAfter
,传递给它调用的函数将从主线程调用。谢谢。我假设我的线程将需要传递一个窗口(即大型机中的self
),以便我可以调用wx.CallAfter(self.window.text\u control.SetValue.SetValue,“some_text”)
类中的循环中的。@sam是的,您将需要访问要修改的控件。实现这一点的一种方法(和其他方法一样好)是将窗口传递给线程。
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()
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.CallAfter(text_control.SetValue, "some_text")