有很多类似的问题,但我找不到一个特别适用于我所要做的事情的问题。在
我有一个模拟(用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捕获,所有文本都只来自导入的模块。在
(另外,关于停止按钮的第二个问题-仅仅杀死模拟线程是不是很糟糕?)。在
谢谢
邓肯
我建议你调查一下这个问题。在
它专门解决了使用“开始”按钮作为一个长时间运行的进程所处理的情况。使用不同的技术(如线程和空闲处理程序)给出了几个不同的示例。在
我认为您必须将stdout重定向到日志文件(或简单的SQLite数据库?)然后使用线程检查日志文件中的更新,然后使用wx.CallAfter公司或者类似的。您可以使用类似于Python中内置的socket服务器:http://wiki.wxpython.org/AsynchronousSockets。我想wxPython的食谱中也提到了一些关于使用RPC服务器的内容(可能是这个:http://docs.python.org/library/simplexmlrpcserver.html),但我不记得其中的细节。在
你也应该试着在wxPython的官方邮件列表中询问。他们在那边很友好。在
相关问题 更多 >
编程相关推荐