当你移动Tkinter窗口停止程序

时间:2011-05-06 05:03:19

标签: python tkinter urllib2

您好 我做了一个很棒的音乐下载程序它告诉你完成它的百分比然后如果我移动窗口它会停止下载。 我制作了一个不同的小脚本,可以在网上下载指定的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()

1 个答案:

答案 0 :(得分:2)

问题很可能是因为您正在呼叫update。除非你确切知道后果是什么,否则你永远不应该这样做。 update导致输入新的事件循环。从本质上讲,你最终会在无限循环中产生无限循环。

尝试将update更改为update_idletasks,看看是否能解决您的问题。 update的这种变化只处理“空闲”事件,例如屏幕重绘,并且不太可能导致问题。

此外,您绝对不需要“更新;插入;删除;更新”。这不会有任何明显的影响。删除后对update_idletasks的单次调用就足够了。

最后,您可以通过重新排列代码来完全避免使用update_idletasks。编写一个读取单个数据块并更新进度条的函数。然后,如果它尚未达到EOF,请在几毫秒后再次使用after调用该函数。当它到达EOF时它停止呼唤自己。这样做意味着您不必创建自己的潜在无限循环,并且保证每次迭代都输入一次事件循环。一旦检测到此EOF,您就可以调用一个函数(再次使用after)进行任何最终处理。