将 sys.stdout 从 ping 结果重定向到 wx.文本控制小部件



我正在尝试将sys.stdout流重定向到wx。文本控制小部件。在此代码中,我使用了ping,但是如何将结果重定向到wx.textctrl或statictext小部件。我可以将变量从我的输入发送到 wx.statictext,但无法从 ping 结果中获取标准输出。希望这里有人可以提供帮助。

我正在使用带有 wx 2.8.12.1 的 python 3.6.0

import wx
import os

class RandomPanel(wx.Panel):
def __init__(self, parent, color):
wx.Panel.__init__(self, parent)
self.SetBackgroundColour(color)

class MainPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
topSplitter = wx.SplitterWindow(self)
vSplitter = wx.SplitterWindow(topSplitter)
panelOne = RandomPanel(vSplitter, "white")

self.txt = wx.TextCtrl(panelOne, 
style=wx.TE_PROCESS_ENTER, 
pos=(7, 8), size=(330, 30))
self.txt.SetFocus()
self.txt.Bind(wx.EVT_TEXT_ENTER, self.ping)
panelTwo = RandomPanel(vSplitter, "white")
vSplitter.SplitVertically(panelOne, panelTwo)
vSplitter.SetSashGravity(0.5)
panelThree = RandomPanel(topSplitter, "black")
topSplitter.SplitHorizontally(vSplitter, panelThree)
topSplitter.SetSashGravity(0.5)
self.term = wx.StaticText(panelThree, -1, '', pos=(6, 100))
self.term.SetForegroundColour((255, 255, 255))  #set font color
self.term.SetBackgroundColour((0, 0, 0)) #set background color
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(topSplitter, 1, wx.EXPAND)
self.SetSizer(sizer)
def ping(self, event):
put = self.txt.GetValue()
self.p = os.system("ping -n 1 "+put)
self.term.SetLabel(put)
self.p.AppendText('>>> ')
self.p.AppendText(event)

class MainFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="ping tool",
size=(800, 600))
panel = MainPanel(self)
self.Show()

if __name__ == "__main__":
app = wx.App(False)
frame = MainFrame()
app.MainLoop()

import os替换为from subprocess import call, Popen, PIPE, STDOUT然后替换

self.p = os.system("ping -n 1 "+put)
self.term.SetLabel(put)
self.p.AppendText('>>> ')
self.p.AppendText(event)

comm = Popen(['ping',put],stdout=PIPE,stderr=STDOUT,universal_newlines=True)
for i in iter(comm.stdout.readline, b''):
if i != '': pass
else: break
self.term.SetLabel(str(i))
wx.Yield()

这将读取 ping 命令的输出,输出它,然后调用Yield以允许 wx。App() 主循环,用于从for循环内更新屏幕

您可能希望在某个时候在其中放置一个停止机制。

编辑: 为了创建一组滚动结果,我会将self.termStaticText更改为TextCtrl

self.term = wx.TextCtrl(panelThree, -1, '',size=(400,200),style=wx.TE_MULTILINE)

然后在ping例程中将SetLabel更改为AppendText

def ping(self, event):
put = self.txt.GetValue()
comm = Popen(['ping',put],stdout=PIPE,stderr=STDOUT,universal_newlines=True)
for i in iter(comm.stdout.readline, b''):
if i != '': pass
else: break
self.term.AppendText(str(i))
wx.Yield()

萨克森州的@Rolf,我已经更新了代码,感谢您的帮助。

def ping(self, event):
a = []
put = self.txt.GetValue()
comm = Popen(['ping', put], stdout=PIPE, stderr=STDOUT, universal_newlines=True)
for i in iter(comm.stdout.readline, b''):
if i != '':
pass
else:
break
a.append(str(i))
self.term.SetLabelText("start pinging......")
self.term.SetLabelText("n".join(a))
wx.Yield()

最新更新