从wxpython中导入的模块捕获stdout并将其发送到textctrl,而不阻塞GUI

2024-06-09 20:21:57 发布

您现在位置:Python中文网/ 问答频道 /正文

有很多类似的问题,但我找不到一个特别适用于我所要做的事情的问题。在

我有一个模拟(用SimPy编写),我正在为它编写一个GUI,模拟的主要输出是从“print”语句到控制台的文本。现在,我认为最简单的方法是创建一个单独的模块图形用户界面.py,并将我的模拟程序导入其中:

import osi_model

我希望所有的打印语句都被GUI捕获并显示在Textctrl中,这里有无数的示例,大致如下:

^{pr2}$

我还从“开始”按钮开始模拟:

def go_btn_click(self, event):
    print 'GO'
    self.RT = threading.Thread(target=osi_model.RunThis())
    self.RT.start()

这一切都很好,并且来自模拟模块的输出被textcrl捕获,除了GUI锁定并且变得无响应之外-我仍然需要它是可访问的(至少有一个“停止”按钮)。我不确定这是否是我在这里所做的创建新线程的拙劣尝试,但我认为在这个过程的某个阶段将需要一个新线程。在

人们建议使用wx.CallAfter公司,但我不确定如何进行这项工作,因为导入的模块不了解wx,而且我也无法实际查看整个仿真架构并将所有打印语句更改为wx.CallAfter公司,任何从导入的模拟程序内部捕获shell的尝试都会导致程序崩溃。在

有人知道我怎样才能最好地做到这一点吗?因此,我真正需要的是,在GUI保持响应的同时,所有控制台文本都被textcrl捕获,所有文本都只来自导入的模块。在

(另外,关于停止按钮的第二个问题-仅仅杀死模拟线程是不是很糟糕?)。在

谢谢

邓肯


Tags: 模块文本selfmodelguiosi语句线程
2条回答

我建议你调查一下这个问题。在

它专门解决了使用“开始”按钮作为一个长时间运行的进程所处理的情况。使用不同的技术(如线程和空闲处理程序)给出了几个不同的示例。在

我认为您必须将stdout重定向到日志文件(或简单的SQLite数据库?)然后使用线程检查日志文件中的更新,然后使用wx.CallAfter公司或者类似的。您可以使用类似于Python中内置的socket服务器:http://wiki.wxpython.org/AsynchronousSockets。我想wxPython的食谱中也提到了一些关于使用RPC服务器的内容(可能是这个:http://docs.python.org/library/simplexmlrpcserver.html),但我不记得其中的细节。在

你也应该试着在wxPython的官方邮件列表中询问。他们在那边很友好。在

相关问题 更多 >