python tkinter进度条_python-为什么tkinter进度栏会使事情变得这么慢?

我有以下代码用于提取tar.gz文件,同时保留进度标签:

from __future__ import division

import tarfile

import os

theArchive = "/Users/Dennis/Instances/atlassian-jira-enterprise-4.1.2-standalone.tar.gz"

a = tarfile.open(theArchive)

tarsize = 0

print "Computing total size"

for tarinfo in a:

tarsize = tarsize + tarinfo.size

realz = tarsize

print "compressed size: " + str(a.fileobj.size)

print "uncompressed size: " + str(tarsize)

tarsize = 0

for tarinfo in a:

print tarinfo.name, "is", tarinfo.size, "bytes in size and is",

if tarinfo.isreg():

print "a regular file."

elif tarinfo.isdir():

print "a directory."

else:

print "something else."

a.extract(tarinfo)

tarsize = tarsize + tarinfo.size

print str(tarsize) + "/" + str(realz)

outout = tarsize / realz

print "progress: " + str(outout)

a.close()

这非常快,可以在10秒内提取100MB的tar.gz.我也希望在视觉上具有此功能,因此我将其更改为包括tkinter进度栏:

from __future__ import division

import tarfile

import os

import Tkinter

class Meter(Tkinter.Frame):

def __init__(self, master, width=300, height=20, bg='white', fillcolor='orchid1',\

value=0.0, text=None, font=None, textcolor='black', *args, **kw):

Tkinter.Frame.__init__(self, master, bg=bg, width=width, height=height, *args, **kw)

self._value = value

self._canv = Tkinter.Canvas(self, bg=self['bg'], width=self['width'], height=self['height'],\

highlightthickness=0, relief='flat', bd=0)

self._canv.pack(fill='both', expand=1)

self._rect = self._canv.create_rectangle(0, 0, 0, self._canv.winfo_reqheight(), fill=fillcolor,\

width=0)

self._text = self._canv.create_text(self._canv.winfo_reqwidth()/2, self._canv.winfo_reqheight()/2,\

text='', fill=textcolor)

if font:

self._canv.itemconfigure(self._text, font=font)

self.set(value, text)

self.bind('', self._update_coords)

def _update_coords(self, event):

'''Updates the position of the text and rectangle inside the canvas when the size of

the widget gets changed.'''

# looks like we have to call update_idletasks() twice to make sure

# to get the results we expect

self._canv.update_idletasks()

self._canv.coords(self._text, self._canv.winfo_width()/2, self._canv.winfo_height()/2)

self._canv.coords(self._rect, 0, 0, self._canv.winfo_width()*self._value, self._canv.winfo_height())

self._canv.update_idletasks()

def get(self):

return self._value, self._canv.itemcget(self._text, 'text')

def set(self, value=0.0, text=None):

#make the value failsafe:

if value < 0.0:

value = 0.0

elif value > 1.0:

value = 1.0

self._value = value

if text == None:

#if no text is specified use the default percentage string:

text = "Extraction: " + str(int(round(100 * value))) + ' %'

self._canv.coords(self._rect, 0, 0, self._canv.winfo_width()*value, self._canv.winfo_height())

self._canv.itemconfigure(self._text, text=text)

self._canv.update_idletasks()

##-------------demo code--------------------------------------------##

def _goExtract(meter, value):

meter.set(value)

if value < 1.0:

value = value + 0.005

meter.after(50, lambda: _demo(meter, value))

else:

meter.set(value, 'Demo successfully finished')

if __name__ == '__main__':

root = Tkinter.Tk(className='meter demo')

m = Meter(root, relief='ridge', bd=3)

m.pack(fill='x')

m.set(0.0, 'Computing file size...')

m.after(1000)

theArchive = "/Users/Dennis/Instances/atlassian-jira-enterprise-4.1.2-standalone.tar.gz"

a = tarfile.open(theArchive)

tarsize = 0

for tarinfo in a:

tarsize = tarsize + tarinfo.size

realz = tarsize

print "real size: " + str(tarsize)

print "compressed size: " + str(a.fileobj.size)

m.set(0.0, 'Done computing!')

m.after(1000)

tarsize = 0

for tarinfo in a:

print tarinfo.name, "is", tarinfo.size, "bytes in size and is",

if tarinfo.isreg():

print "a regular file."

elif tarinfo.isdir():

print "a directory."

else:

print "something else."

a.extract(tarinfo)

tarsize = tarsize + tarinfo.size

print str(tarsize) + "/" + str(realz)

outout = tarsize / realz

m.set(outout)

print "progress: " + str(outout)

a.close()

m.set(1.0, 'Extraction complete!')

m.after(1000)

m.after(1000, lambda: _goExtract(m, 0.0))

一切正常,但现在过程需要2分钟多的时间.为什么会发生这种情况,我该如何解决?

谢谢!

丹尼斯

解决方法:

档案中的文件有多大?几乎可以肯定,更新进度条的工作量远远超出了您的需要-通常在set()函数中包含一个检查,以便如果从上一个值开始的更改太小,它只返回而不进行更新.对于300px的画布,绝对没有必要进行小于0.3%的更改,并且更新频率可能不超过每1%.

由于您的过程通常在10秒钟内完成,因此您可能还需要引入基于时间的检查,因为即使每1%更新一次,每秒也会进行10次,这超出了您的需要.如果您从简单的for循环中驱动Tk,绘制条会花费多长时间会很有趣.

标签:tkinter,tar,python

来源: https://codeday.me/bug/20191023/1916046.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值