0

我是 Python 的新手(实际上是 PC 开发的新手),我想知道我应该如何正确解决在我正在编写的 Windows 应用程序中使用 FileDialog 时遇到的问题......

到目前为止,这是我的代码的相关部分......

def SelectLogs(self, event):

    dir = os.getcwd()
    paths = []

    open_dlg = wx.FileDialog(self, message='Select log file',
        defaultDir=dir, style=wx.OPEN | wx.CHANGE_DIR | wx.MULTIPLE)

    self.splitter.Refresh(True)

    if open_dlg.ShowModal() == wx.ID_OK:
        paths = open_dlg.GetPaths()
        open_dlg.Destroy()

        self.splitter.Refresh()

        self.RetrieveLogData(paths)

    def RetrieveLogData(self, paths):

        count = 0
        loglines = []

        self.tc2.WriteText('Loading selected logs...')

        paths.sort()

        for log in paths:
            read_data = []
            f = open(log, 'r')

            self.tc2.WriteText('\r\n    ' + log)

            read_data = f.readlines()
            f.close()

            count = count + 1

            for line in read_data:
                loglines.append(line)
                self.tc1.WriteText(line)

        self.tc2.WriteText('\r\nCompleted loading ' + str(count) + ' log(s)')

我的问题是,即使我调用 open_dlg.Destroy() 和 self.splitter.Refresh() 我仍然有 FileDialog 的残余显示在我的 wx.TextCtrl (tc2) 对象的下部(tc1 位于上半部分下半部分的分离器和 tc2)。

一旦文件完全加载并且内容显示在 tc1 中,然后 tc2 就会刷新并按我的预期显示。

我尝试在 tc1 和 tc2 上而不是在拆分器上调用刷新方法,但这似乎没有任何效果。

欢迎任何有用的建议。谢谢。

4

1 回答 1

1

您不需要任何电话Refresh(),这些电话将不起作用。您的 GUI 冻结的原因是不同的。您的回调函数运行时间过长并阻塞了您的 GUI 线程。

在不创建新线程的情况下,您永远不应该在回调函数中运行任何可能花费超过几毫秒的任务。

您应该为长时间运行的任务创建一个新线程。我推荐使用wx.lib.delayedresultandwx.CallAfter因为这些是最方便的。SO上有很多关于这个主题的问题/答案。例如:如何在 wxPython GUI 应用程序中实现线程

于 2012-04-04T10:28:11.200 回答