Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
模块之间的wxPython、线程和PostEvent_Python_User Interface_Events_Multithreading_Wxpython - Fatal编程技术网

模块之间的wxPython、线程和PostEvent

模块之间的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,但运气不好 下面

我对wxPython比较陌生(但不是Python本身),所以如果我错过了一些东西,请原谅

我正在编写一个GUI应用程序,它在一个非常基本的级别上由启动和停止线程的“开始”和“停止”按钮组成。这个线程是一个无限循环,只有当线程停止时才会结束。循环生成消息,此时仅使用
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")