python - 在线程中运行 Python 脚本并在 GUI 中将 stdout/stderr 重定向到 wx.TextCtrl

标签 python multithreading user-interface redirect wxpython

我正在尝试编写一个 GUI 来读取 python 脚本的设置,然后生成脚本并运行它。该脚本可能需要数十分钟才能运行,因此为了不阻塞 GUI 并让用户感到沮丧,我在单独的线程中运行它。在我这样做之前,我使用一个单独的类将程序的 std.out 和 std.err 重定向到 TextCtrl。这工作正常,除了 GUI 在执行期间被阻止。

从具有重定向类的线程运行脚本仍然会阻塞 GUI。为了不阻止 GUI,我需要关闭重定向。来自脚本和 gui 的所有 std.out/err 然后进入控制台。

这是重定向的类以及我如何调用它。

# For redirecting stdout/stderr to txtctrl.
class RedirectText(object):
    def __init__(self,aWxTextCtrl):
        self.out=aWxTextCtrl

    def write(self,string):
        self.out.WriteText(string) 

self.redir=RedirectText(self.bottom_text)
sys.stdout=self.redir
sys.stderr=self.redir
sys.stdin=self.redir

我试过使用某种从线程到 GUI 的通信类,但没有成功。也就是说,GUI 仍然被阻止。

有没有人对这个问题有一些提示或解决方案,即在不阻塞 GUI 的情况下从脚本获取 stdout/err 到 GUI?

最佳答案

是的。在线程中,使用 wx.CallAfter 以线程安全的方式将文本发送到 GUI。然后它可以获取文本并显示它。另一种方法是使用子流程并与之通信。这里有一个例子:

http://www.blog.pythonlibrary.org/2010/06/05/python-running-ping-traceroute-and-more/

本文的评论中也列出了一些方法:

http://www.blog.pythonlibrary.org/2009/01/01/wxpython-redirecting-stdout-stderr/

不幸的是,我当时的评论系统在缩进方面做得不好。

关于python - 在线程中运行 Python 脚本并在 GUI 中将 stdout/stderr 重定向到 wx.TextCtrl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3556290/

相关文章:

c++ - 如何在不拖延主循环的情况下实现对话系统?

java - Java 如何同时访问同一个对象的两个不同方法?

iOS 图形界面刷新

html - 如果您打开另一个弹出窗口,请关闭打开的弹出窗口

python - 使用 Etree 和 Python 编辑 XML

python - python中时区切换时不一致

multithreading - Perl 线程安全模块

c# - 动态创建窗口时按钮居中对齐

python - 通过 pyathena 运行 aws athena 查询

python - 可扩展的 Python Markdown 处理器