繁体   English   中英

直到完成整个过程,Python GUI才会更新

[英]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(可能在工作期间报告进度)。

看一下线程或多处理模块。

这是GUI程序的常见问题。 在收到并处理“重新绘制”命令之前,控件不会更新,并且直到函数返回后才会发生。

您可以随时调用控件的Update方法来强制重新绘制控件,如对此问题的答案所示: 如何强制刷新wx.Panel?

我可能建议您尝试wx.lib.delayedresult 这是简化的多线程解决方法。 您可以将业务逻辑放入辅助函数,而将其他逻辑(包括GUI附加,更新)放入使用者函数。 辅助函数在另一个线程中运行,而消费者函数保证在主线程中的辅助函数完成后运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM