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

wxPython-在textctrl小部件中捕获shell输出?,wxpython,subprocess,textctrl,Wxpython,Subprocess,Textctrl,我正在同时学习python和wxPython…:)因此,我有一组可以从命令行正常运行的python文件:/scan-dtest~/Pictures——例如,我将创建一个名为“test”的图片数据库 我一直在为此努力开发前端(我没有编写原始的命令行python文件),我可以使用以下方法运行它: def bt_ScanUpdateClick(self, event): self.SetSizeWH(450,360) ## DEBUG self.tc_MainDatabase

我正在同时学习python和wxPython…:)因此,我有一组可以从命令行正常运行的python文件:
/scan-dtest~/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 += "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]
def bt_scannupdateclick(self,event):
自我设定值WH(450360)
##调试
self.tc_maindabase.Value=“test.db”
如果self.tc_maindabase.Value==“”:
self.LogWindow.Value+=“错误:\t未选择数据库名称!\n”
其他:
scanCMD=“./scan-d”+self.tc\u maindabase.Value+”
numLines=0
maxLines=(int(self.multiText.GetNumberOfLines())
如果self.multiText.GetLineText(numLines)=“”:
self.LogWindow.Value+=“错误\t未选择要扫描的文件夹!\n”
其他:
self.LogWindow.Value+=“正在运行扫描…\n\n”
而(numLines
这给我带来了一个问题:

  • 一旦我点击按钮激活 这个,它实际上甚至没有得到 至自动设定尺寸WH(450360)零件 函数的类型。它只是停留在一个角落里 “关闭”状态。什么时候 命令完成后,应用程序就会出现 回到生活中,一切尽在掌握之中 输出窗口(self.LogView)已。。。我会的 希望以更精确的方式获得输出 “实时”方式。。。可能吗

  • 有什么想法吗?

    粗略地说,屏幕更新发生在事件循环的每个迭代过程中。当代码运行时,事件循环被困在同一个迭代中,因此无法进行屏幕更新

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


    有关更多信息,请参阅wxPython wiki上的页面,并参阅本网站上的问题

    粗略地说,屏幕更新发生在事件循环的每个迭代过程中。当代码运行时,事件循环被困在同一个迭代中,因此无法进行屏幕更新

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


    有关更多信息,请参阅wxPython wiki上的页面,并参阅本网站上的问题

    在上面Bryan的回答和这个链接之间:[wxpython:实时捕获子流程的输出][1]。。。我让它工作了![1] :在上面Bryan的回答和此链接之间:[wxpython:实时捕获子流程的输出][1]。。。我让它工作了![1]: