首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将sys.stdout从ping结果重定向到wx.TextCtrl小部件

将sys.stdout从ping结果重定向到wx.TextCtrl小部件
EN

Stack Overflow用户
提问于 2017-11-13 03:22:15
回答 2查看 277关注 0票数 0

我试图将sys.stdout流重定向到wx.TextCtrl小部件。在这段代码中,我使用了ping,但是如何将结果重定向到wx.textctrl或静态文本小部件。我可以将变量从我的输入发送到wx.statictext,但不能从ping结果中获得标准输出。希望这里有人能帮上忙。

我使用python 3.6.0和wx 2.8.12.1

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-13 09:52:13

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

代码语言:javascript
复制
self.p = os.system("ping -n 1 "+put)
self.term.SetLabel(put)
self.p.AppendText('>>> ')
self.p.AppendText(event)

使用

代码语言:javascript
复制
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

代码语言:javascript
复制
self.term = wx.TextCtrl(panelThree, -1, '',size=(400,200),style=wx.TE_MULTILINE)

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

代码语言:javascript
复制
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()
票数 0
EN

Stack Overflow用户

发布于 2017-11-14 05:52:57

@Rolf of Saxony,我更新了代码,谢谢您的帮助。

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47256635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档