Захват вывода потока для перенаправления его в GUI (wxpython) в Python - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть графический интерфейс, встроенный в WxPython.У меня также есть функция в том же скрипте Python со встроенными объектами JSON, которую я хочу вызывать как поток (Фоновый процесс)

Я хочу захватить выходные данные этого потока, чтобы перенаправить его на Multilineтекстовое поле в графическом интерфейсе.

Я смог сделать это с subprocess.popen, но теперь я хочу сделать это в потоке, и я не могу использовать proca.stdout в потоках так же, как подпроцесс.Любая помощь по этому вопросу будет принята с благодарностью.

Спасибо!PR

1 Ответ

0 голосов
/ 02 января 2019

wxpython требует, чтобы некоторые вещи вызывались из основного потока.Это можно сделать с помощью звонков на wx.CallAfter или wx.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()
...