2

我有一个内置在 WxPython 中的 GUI。我在同一个 python 脚本中也有一个带有嵌入 JSON 对象的函数,我想将该函数称为线程(后台进程)

我想捕获该线程的输出以将其重定向到 GUI 中的多行文本框。

我可以用 subprocess.popen 做到这一点,但现在我想在一个线程中做到这一点,我不能像 subprocess 一样在线程中使用 proca.stdout。对此的任何帮助将不胜感激。

谢谢!公关

4

1 回答 1

1

wxpython 要求从主线程调用一些东西。这可以通过调用wx.CallAfterwx.CallLater创建和发布您自己的自定义事件来完成。wx.TextCtrl.SetValue似乎是线程安全的。有几个关于如何用 wxpython 实现线程的例子,但这里有另一个例子:

# tested on windows 10, python 3.6.8
import wx, threading, time


class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "Test Frame", wx.DefaultPosition, (500, 500))
        self.tc = wx.TextCtrl(self, -1, "Click button to start thread...", size=(500, 350), style=wx.TE_MULTILINE)
        self.button = wx.Button(self, label="Click to start thread", pos=(0, 360))
        self.button.SetSize(self.button.GetBestSize())
        self.button.CenterOnParent(wx.HORIZONTAL)

        self.thread = None
        self.button.Bind(wx.EVT_BUTTON, self.on_button)
        self.Show()

    def on_button(self, event):
        self.thread = threading.Thread(target=self.threaded_method)
        self.thread.start()

    def threaded_method(self):
        self.tc.SetValue("thread has started.....")
        time.sleep(1.5)
        for n in range(5, 0, -1):
            self.tc.SetValue(f"thread will exit in {n}")
            time.sleep(1)
        self.tc.SetValue("thread has finished")


app = wx.App()
frame = MainFrame()
app.MainLoop()
于 2019-01-02T18:13:40.327 回答