Захват вывода потока для перенаправления его в GUI(wxpython) в Python
У меня есть графический интерфейс, встроенный в WxPython. У меня также есть функция в том же скрипте Python со встроенными объектами JSON, которую я хочу вызывать как поток (фоновый процесс)
Я хочу захватить выходные данные этого потока, чтобы перенаправить его в многострочное текстовое поле в графическом интерфейсе.
Я смог сделать это с subprocess.popen, но теперь я хочу сделать это в потоке, и я не могу использовать proca.stdout в потоках так же, как подпроцесс. Любая помощь по этому вопросу будет принята с благодарностью.
Спасибо! PR
1 ответ
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()