Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python(Windows XP)-wx.FileDialog在销毁()后部分保留_Python_Wxpython_Refresh_Destroy_Filedialog - Fatal编程技术网

Python(Windows XP)-wx.FileDialog在销毁()后部分保留

Python(Windows XP)-wx.FileDialog在销毁()后部分保留,python,wxpython,refresh,destroy,filedialog,Python,Wxpython,Refresh,Destroy,Filedialog,我是Python新手(事实上,对PC开发也是新手),我想知道如何在我正在编写的Windows应用程序中正确解决使用FileDialog时遇到的问题 这是我的代码到目前为止的相关部分 def SelectLogs(self, event): dir = os.getcwd() paths = [] open_dlg = wx.FileDialog(self, message='Select log file', defaultDir=dir, style

我是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(),我仍然在wx.TextCtrl(tc2)对象的下半部分显示文件对话框的剩余部分(tc1在拆分器的上半部分,tc2在下半部分)

一旦文件被完全加载并在tc1中显示内容,tc2就会像我所期望的那样刷新和显示

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


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

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

在不创建新线程的情况下,绝不能在回调函数中运行任何可能需要几毫秒以上时间的任务


您应该为长时间运行的任务创建一个新线程。我建议使用
wx.lib.delayedresult
wx.CallAfter
,因为它们是最方便的。关于这个话题,有很多问题/答案。例如:

非常感谢您的帮助-我将阅读您推荐的解决方案,并在我的应用程序中实施它们。