我是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上调用刷新方法,而不是在分割器上调用,但这似乎没有任何效果。
欢迎任何有用的建议。感谢。
答案 0 :(得分:1)
您不需要对Refresh()
进行任何调用,但这些调用无效。您的GUI冻结的原因是不同的。您的回调函数运行时间过长并阻止您的GUI线程。
在不创建新线程的情况下,您不应该在回调函数中运行任何可能需要超过几毫秒的任务。
您应该为长时间运行的任务创建一个新线程。我建议使用wx.lib.delayedresult
和wx.CallAfter
,因为这些是最方便的。 SO上有很多关于这个主题的问题/答案。例如:How to implement a thread in a wxPython GUI application