【问题标题】:wxPython - capturing shell output in a textctrl widget?wxPython - 在 textctrl 小部件中捕获 shell 输出?
【发布时间】:2011-07-10 02:28:03
【问题描述】:

我正在同时学习 python 和 wxPython... :) 所以,我有一组可以从命令行正常运行的 python 文件:./scan -d test ~/Pictures -- 例如将创建一个包含我的图片的数据库称为“测试”。

我一直在为此努力开发前端(我没有编写原始的命令行 python 文件),我可以通过以下方式运行它:

def bt_ScanUpdateClick(self, event):
    self.SetSizeWH(450,360)

    ## DEBUG
    self.tc_MainDatabase.Value = "test.db"


    if self.tc_MainDatabase.Value == "":
        self.LogWindow.Value += "ERROR:\tNo database name selected!\n"
    else:
        scanCMD = "./scan -d " + self.tc_MainDatabase.Value + " "

        numLines=0
        maxLines=(int(self.multiText.GetNumberOfLines()))

        if self.multiText.GetLineText(numLines) == "":
            self.LogWindow.Value += "ERROR\tNo folder selected to scan!\n"
        else:
            self.LogWindow.Value += "Running Scan...\n\n"
            while (numLines < maxLines):
                scanCMD += str(self.multiText.GetLineText(numLines)) + " "
                numLines += 1

            self.LogWindow.Value += scanCMD

            p = subprocess.Popen([scanCMD],shell=True,stdout=subprocess.PIPE,stdin=subprocess.PIPE)
            self.LogWindow.Value += p.communicate()[0]

这给我带来了一个问题:

  1. 单击按钮激活后 这个,它实际上甚至没有得到 到 self.SetSizeWH(450,360) 部分 的功能。它只是停留在一个 “下”状态。什么时候 命令完成,应用程序来了 与生活中的一切一起恢复生机 输出窗口(self.LogView)已经......我会 喜欢以更多的方式获得输出 “实时”方式……可能吗?

有什么想法吗?

【问题讨论】:

标签: wxpython subprocess textctrl


【解决方案1】:

粗略地说,屏幕更新发生在事件循环的每次迭代中。当您的代码正在运行时,事件循环卡在同一次迭代中,因此无法进行屏幕更新。

要解决此问题,您需要在单独的线程或进程中运行长时间运行的任务。因为 wxPython 是单线程的,所以对 GUI 的任何更新(例如写入输出行)都必须在主线程中完成。为此,您的工作线程可以使用wx.CallAfter,它将安排一个命令尽早在 GUI 线程中运行。

有关更多信息,请参阅 wxPython wiki 上的页面 Long Running Tasks,并参阅本网站上问题 wxPython: Problems with thread.this answer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多