wxPython:异步执行命令,在文本小部件中显示stdout

时间:2009-05-18 20:01:17

标签: wxpython

我正在寻找与Tcl/Tk examples?的答案相当的wxPython。具体来说,我想看一个如何创建几个按钮的示例,每个按钮在单击时都会运行一些外部命令。当进程正在运行时,我希望输出转到可滚动的wxPython小部件。

当进程正在运行时,GUI不应该阻止。例如,假设其中一个按钮可以启动开发任务,例如构建或运行单元测试。

3 个答案:

答案 0 :(得分:7)

这是一个完整的工作示例。

import wx
import functools
import threading
import subprocess
import time

class Frame(wx.Frame):
    def __init__(self):
        super(Frame, self).__init__(None, -1, 'Threading Example')
        # add some buttons and a text control
        panel = wx.Panel(self, -1)
        sizer = wx.BoxSizer(wx.VERTICAL)
        for i in range(3):
            name = 'Button %d' % (i+1)
            button = wx.Button(panel, -1, name)
            func = functools.partial(self.on_button, button=name)
            button.Bind(wx.EVT_BUTTON, func)
            sizer.Add(button, 0, wx.ALL, 5)
        text = wx.TextCtrl(panel, -1, style=wx.TE_MULTILINE|wx.TE_READONLY)
        self.text = text
        sizer.Add(text, 1, wx.EXPAND|wx.ALL, 5)
        panel.SetSizer(sizer)
    def on_button(self, event, button):
        # create a new thread when a button is pressed
        thread = threading.Thread(target=self.run, args=(button,))
        thread.setDaemon(True)
        thread.start()
    def on_text(self, text):
        self.text.AppendText(text)
    def run(self, button):
        cmd = ['ls', '-lta']
        proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        for line in proc.stdout:
            wx.CallAfter(self.on_text, line)

if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = Frame()
    frame.Show()
    app.MainLoop()

答案 1 :(得分:0)

单击按钮时启动一个线程:

try:
    r = threading.Thread(target=self.mycallback)
    r.setDaemon(1)
    r.start()
except:
    print "Error starting thread"
    return False

使用wx.PostEvent和wx.lib.newevent将回调中的消息发送到主线程。

link可能会有所帮助。

答案 2 :(得分:0)

布莱恩,尝试这样的事情:

import subprocess, sys

def doit(cmd):
    #print cmd
    out = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True).stdout
    return out.read()

因此,当按下该按钮时,该命令将使用子进程模块运行,并将输出作为字符串。您可以将其指定给文本控件的值以显示它。您可能必须out.readfully()或多次读取以逐步显示文本。

如果按钮&文本字段不熟悉,然后快速查看wxPython demo将向您显示确切的操作。