wxPython -在textctrl小部件中捕获shell输出



我正在同时学习python和wxPython…:)所以,我有一组从命令行运行良好的python文件:例如,./scan -d test ~/Pictures将创建一个名为"test"的图片数据库。"

我一直在努力为这个前端工作(我没有写原始的命令行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 += "ERRORtNo folder selected to scan!n"
        else:
            self.LogWindow.Value += "Running Scan...nn"
            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)部分函数的。它就呆在a里"下来"状态。当命令完成后,应用程序出现了回到生活中,一切都在输出窗口(self.LogView)已经…我将喜欢得到更多的输出"实时"的方式……可能吗?

任何想法吗?

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

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

有关更多信息,请参阅wxPython wiki上的长时间运行任务页面,并参阅对wxPython:线程问题的回答。在这个网站上。

相关内容

  • 没有找到相关文章

最新更新