[英]Python: GUI does not update until code is finished despite threading
[英]Python GUI does not update until entire process is finished
我有一个从目录获取文件并将其放入列表的过程。 然后,它循环循环该列表。 循环的最后一行是应该更新我的gui显示的位置,然后从列表中的下一项再次开始循环。
我的问题是,直到整个过程完成,它才真正更新gui,具体取决于列表的大小可能是30秒到一分钟以上。 这给程序带来了“挂起”的感觉
我想要它做的是处理列表中的一行,更新gui,然后继续。 我哪里做错了? 更新列表的行是#用驱动器内容填充listview。 打印语句仅用于调试。
def populateList(self):
print "populateList"
sSource = self.txSource.Value
sDest = self.txDest.Value
# re-intialize listview and validated list
self.listView1.DeleteAllItems()
self.validatedMove = None
self.validatedMove = []
#Create list of files
listOfFiles = getList(sSource)
#prompt if no files detected
if listOfFiles == []:
self.lvActions.Append([datetime.datetime.now(),"Parse Source for .MP3 files","No .MP3 files in source directory"])
#Populate list after both Source and Dest are chosen
if len(sDest) > 1 and len(sDest) > 1:
print "-iterate listOfFiles"
for file in listOfFiles:
sFilename = os.path.basename(file)
sTitle = getTitle(file)
sArtist = getArtist(file)
sAlbum = getAblum(file)
# Make path = sDest + Artist + Album
sDestDir = os.path.join (sDest, sArtist)
sDestDir = os.path.join (sDestDir, sAlbum)
#If file exists change destination to *.copyX.mp3
sDestDir = self.defineDestFilename(os.path.join(sDestDir,sFilename))
# Populate listview with drive contents
self.listView1.Append([sFilename,sTitle,sArtist,sAlbum,sDestDir])
#populate list to later use in move command
self.validatedMove.append([file,sDestDir])
print "-item added to SourceDest list"
else:
print "-list not iterated"
这是GUI程序的常见问题。 在收到并处理“重新绘制”命令之前,控件不会更新,并且直到函数返回后才会发生。
您可以随时调用控件的Update
方法来强制重新绘制控件,如对此问题的答案所示: 如何强制刷新wx.Panel?
我可能建议您尝试wx.lib.delayedresult 。 这是简化的多线程解决方法。 您可以将业务逻辑放入辅助函数,而将其他逻辑(包括GUI附加,更新)放入使用者函数。 辅助函数在另一个线程中运行,而消费者函数保证在主线程中的辅助函数完成后运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.