我正在使用wxPython創建一個GUI。我試圖從subprocess.Popen到TextCtrl一次顯示一行結果。由於存在大量的信息,窗口在完全顯示所有內容之前經歷了「不迴應」階段。我也在使用線程。 我已經嘗試了poll,read(),readline(),itr,並且輸出仍然一次顯示,而不是逐行顯示在窗口的簡短NOT RESPONDING階段之後。如果有人能夠幫助我解決這個問題,那將會很棒。謝謝!如何從子流程標準輸出獲得結果並在TextCtrl中實時顯示它們? (Python 2.7 - wxPython)
回答
如果你是在一個線程中運行subprocess
,那麼你只需要一個參考傳遞給您的文本控件到線程,然後使用wxPython中的線程安全的方法之一,如wx.CallAfter
調用文本控件的write
方法。這裏有一個非常簡單的例子:
import subprocess
import time
import wx
from threading import Thread
class PingThread(Thread):
def __init__(self, text_ctrl):
Thread.__init__(self)
self.text_ctrl = text_ctrl
self.sentinel = True
self.start()
def run(self):
proc = subprocess.Popen("ping www.google.com",
shell=True,
stdout=subprocess.PIPE)
while self.sentinel:
line = proc.stdout.readline()
if line.strip() == "":
pass
else:
wx.CallAfter(self.text_ctrl.write, line)
if not line: break
proc.kill()
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title='Redirecter')
self.ping_thread = None
main_sizer = wx.BoxSizer(wx.VERTICAL)
panel = wx.Panel(self)
self.log = wx.TextCtrl(panel, style=wx.TE_MULTILINE)
ping_btn = wx.Button(panel, label='Ping')
ping_btn.Bind(wx.EVT_BUTTON, self.on_ping)
main_sizer.Add(self.log, 1, wx.ALL|wx.EXPAND, 5)
main_sizer.Add(ping_btn, 0, wx.ALL, 5)
panel.SetSizer(main_sizer)
self.Bind(wx.EVT_CLOSE, self.on_close)
self.Show()
def on_ping(self, event):
self.ping_thread = PingThread(self.log)
def on_close(self, event):
if self.ping_thread:
self.ping_thread.sentinel = False
self.ping_thread.join()
self.Destroy()
if __name__ == '__main__':
app = wx.App(False)
frame = MyFrame()
app.MainLoop()
您可以通過以下鏈接瞭解更多關於wxPython的和線程:
這是一個很好的例子@MikeDriscoll。未答覆問題已解決:D。我想知道是否有一種方法來實時顯示stdout? –
這將會非常接近實時。你有什麼理由需要它比這更快? –
出於某種原因,它仍然在漫長的等待之後立即顯示所有內容。我只是希望用戶能夠看到輸出實時,因爲它是一個漫長的過程,不希望他們認爲沒有任何東西在運行。這是我想要實時的唯一原因。另外,非常感謝你幫助我一樣! :) –
- 1. Python從子流程捕獲標準輸出逐行
- 2. wxPython - 從一個TextCtrl處理輸入並將輸出發送到另一個TextCtrl?
- 3. 如何在python 2.7中打印結果時顯示中文?
- 4. 如何捕獲輸出並使用Python同時顯示它?
- 5. 如何讀取子進程python 2.7和Apache的實時輸出
- 6. 在Python中的流標準輸出/標準輸出
- 7. python子流程輸出到標準輸出
- 8. 如何在運行git命令時獲得子進程標準輸出?
- 9. 在Python中實時顯示結果
- 10. Python 2.7發佈,並從網站獲得結果
- 11. 我們如何獲得子進程的子進程的輸出
- 12. Python 2.7:使用子進程和For循環輸出結果
- 13. 寫入到標準輸入並從標準輸出中讀取長時間運行的子進程中的python
- 14. 從流程獲取實時輸出
- 15. Python子流程標準桿
- 16. Python:從後臺子進程獲取標準輸出
- 17. 如何從準備好的語句中獲得標量結果?
- 18. Ansible從標準輸出獲得列
- 19. Python子流程;無法讀取標準輸出
- 20. 使用Ansible docker_container,我該如何顯示標準? (標準輸出)
- 21. 使用Paramiko的標準輸出作爲標準輸入與子流程
- 22. 獲得子流程中的命令輸出
- 23. 如何監視python中的子進程與標準輸出?
- 24. 將文件用作標準輸入和標準輸出進行子流程
- 25. 無法從stdout中獲得結果,子流程
- 26. 如何從CreateProcessWithLogonW獲取標準輸出?
- 27. 如何在wxPython TextCtrl中捕獲在獨立進程中運行的shell腳本的輸出?
- 28. C# - 如何在進程退出時關閉標準輸入和輸出流?
- 29. 如何搜索Ilist中的項目並顯示輸出結果?
- 30. 從python paramiko獲得標準輸出的問題
正如我們不知道它是什麼你正在做的請閱讀https://stackoverflow.com/help/mcve –