您好 我做了一个很棒的音乐下载程序它告诉你完成它的百分比然后如果我移动窗口它会停止下载。 我制作了一个不同的小脚本,可以在网上下载指定的mp3,我可以随心所欲地移动它,然后停止播放。
我没有提出代码的唯一原因是它真的很长。它大约1500线。这是我下载一个文件的小脚本。
是否有人知道为什么它会阻止程序运行? 小脚本:
from Tkinter import *
from urllib2 import *
admin = Tk()
Admin = Tk()
listbox = Listbox(admin, bg="PURPLE")
listbox.pack()
def __init__(self, master):
def replay():
Admin.destroy()
os.system('WhaleWire.exe')
frame = Frame(master)
frame.pack()
image1 = PhotoImage(file="whalewire.gif")
w = image1.width()
h = image1.height()
master.geometry("%dx%d+0+0" % (w, h))
# tk.Frame has no image argument
panel1 = Label(master, image=image1)
panel1.pack(side='top', fill='both', expand='yes')
panel1.image = image1
self.e = Entry(frame)
self.e.grid(row=0, column=0)
b = Button(frame, text='Search', command=self.whale)
b.grid(row=0, column=1)
def library():
path = 'C:\WhaleWire\Downloaded'
aw=[]
for infile in glob.glob( os.path.join(path,'*.mp3') ):
libr = infile.split('Downloaded',1)
aw.append('\n')
aw.append(infile)
la = Label(Admin,width=100,height=50, text=aw).grid(row=0,column=7)
b2s = Button(Admin,text='Search', command=replay).grid(row=0,column=8)
b11 = Button(frame, text='Library', command=library)
b11.grid(row=0, column=3)
def fores():
chunks = 10000
dat = ''
song = '3 rounds and a sound'
url = 'http://bonton.sweetdarkness.net/music/Blind%20Pilot%20--%203%20Rounds%20and%20A%20Sound.mp3'
down = urlopen(url)
downso = 0
tota = down.info().getheader('Content-Length').strip()
tota = int(tota)
while 1:
a = down.read(chunks)
downso += len(a)
if not a:
break
dat += a
percent = float(downso) / tota
percent = round(percent*100, 1)
listbox.insert(END, percent)
listbox.update()
listbox.delete(0, END)
listbox.insert(END, percent)
listbox.update()
button = Button(Admin, text='Download', command=fores)
button.pack()
button = Button(Admin, text='Download', command=fores)
button.pack()
mainloop()
答案 0 :(得分:2)
问题很可能是因为您正在呼叫update
。除非你确切知道后果是什么,否则你永远不应该这样做。 update
导致输入新的事件循环。从本质上讲,你最终会在无限循环中产生无限循环。
尝试将update
更改为update_idletasks
,看看是否能解决您的问题。 update
的这种变化只处理“空闲”事件,例如屏幕重绘,并且不太可能导致问题。
此外,您绝对不需要“更新;插入;删除;更新”。这不会有任何明显的影响。删除后对update_idletasks
的单次调用就足够了。
最后,您可以通过重新排列代码来完全避免使用update_idletasks
。编写一个读取单个数据块并更新进度条的函数。然后,如果它尚未达到EOF,请在几毫秒后再次使用after
调用该函数。当它到达EOF时它停止呼唤自己。这样做意味着您不必创建自己的潜在无限循环,并且保证每次迭代都输入一次事件循环。一旦检测到此EOF,您就可以调用一个函数(再次使用after
)进行任何最终处理。