【问题标题】:Tkinter label update during code run代码运行期间的 Tkinter 标签更新
【发布时间】:2011-12-12 15:18:56
【问题描述】:

我有一个带有一个按钮和一个文本标签的 tkinter 窗口。当按下按钮时,脚本会使用 FTP 下载文件。我希望标签显示当前的下载进度。下载代码、根窗口和进度监视器都可以正常工作。但是标签从 0 开始,直到下载完成后才更新到 100。如何使按钮开始的代码与窗口 mainloop() 同时运行并让它们通信?

from Tkinter import *
from time import sleep
from ftplib import FTP
import os
try:
    root = Tk()
    class processor():
        def __init__(self):
            self.amount_transfered=0
            self.download_size=0

        def window(self,master):
            self.content = Frame(master)
            self.content.grid(column=0, row=0)
            self.content.master.title('Parcel Processor')

            self.downLbl=Label(self.content,text='Downloading').grid(column=0,row=0)
            self.downVar=StringVar()
            self.downVar.set('0')
            self.downPct=Label(self.content,textvariable=self.downVar).grid(column=1,row=0)
            self.start=Button(self.content, text='START', command=self.parcelDownloader).grid(column=0, row=1)

        def handleDownload(self,block):
            self.parcel_zip.write(block)
            self.downVar.set(str(((self.amount_transfered + len(block))*100)/self.download_size))
            self.amount_transfered = self.amount_transfered + len(block)

        def parcelDownloader(self):
            os.chdir(r"C:\GIS Projects\Parcel Downloads")
            ftp=FTP("FTPSITE", "User", "Pass")
            ftpdatelist=[]
            for filename in ftp.nlst():
                if filename[0:2]=='pa':
                    ftpdatelist.append(filename[:8])            
            parcels='%s.zip' % max(ftpdatelist)
            self.download_size=ftp.size(parcels)
            try:
                self.parcel_zip = open("parcels.zip", 'wb')
                ftp.retrbinary('RETR %s' % parcels, self.handleDownload, 327680)
                self.parcel_zip.close()
            except Exception as e:
                print e
                self.parcel_zip.close()
            finally:
                ftp.quit()
                self.amount_transfered=0

    processor=processor()
    processor.window(root)
    root.mainloop()

except Exception as e:
    print e
    sleep(10)

【问题讨论】:

标签: python tkinter


【解决方案1】:

您可以通过手动强制刷新窗口刷新事件 循环。在顶层 Tk 上使用 update_idletasks() 方法,它 应该正确刷新东西。见:

http://www.pythonware.com/library/tkinter/introduction/x9374-event-processing.htm

其中谈到了更多。

【讨论】:

【解决方案2】:

这有帮助吗?每 1/10 秒调用一次

root.after(100, lambda: label.config(text=downloadprogress))

【讨论】:

    猜你喜欢
    • 2016-08-11
    • 2021-07-16
    • 2012-06-30
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多