1

我正在同时学习 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 += "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. 一旦我单击 Button 来激活它,它实际上甚至没有到达函数的 self.SetSizeWH(450,360) 部分。它只是停留在“关闭”状态。命令完成后,应用程序恢复生机,输出窗口(self.LogView)中的所有内容都已经恢复了......我想以更“实时”的方式获得输出......可能吗?

有什么想法吗?

4

1 回答 1

1

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

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

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

于 2011-07-10T03:00:56.683 回答