При перемещении окон Tkinter программа останавливается - PullRequest
2 голосов
/ 06 мая 2011

Привет Я сделал программу для загрузки музыки, которая прекрасно работает, она сообщает вам процент выполненных работ, а затем, если я вообще переместил окно, он перестал загружаться. Я сделал небольшой сценарий, который загружает указанный 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 Ответ

2 голосов
/ 06 мая 2011

Скорее всего, проблема в том, что вы звоните update.Вы никогда не должны этого делать, если не знаете наверняка, каковы последствия.update вызывает новый цикл обработки событий.По сути, вы получаете бесконечный цикл внутри бесконечного цикла.

Попробуйте изменить update на update_idletasks и посмотрите, решит ли это вашу проблему.Этот вариант update обрабатывает только «незанятые» события, такие как перерисовки экрана, и с гораздо меньшей вероятностью вызывает проблемы.

Кроме того, вам определенно не нужно «обновлять; вставлять; удалять; обновлять».Это не будет иметь никакого заметного эффекта.Достаточно одного вызова update_idletasks после удаления.

Наконец, вы можете полностью избежать использования update_idletasks, переставив код.Напишите функцию, которая читает один кусок данных и обновляет индикатор выполнения.Затем, если он не достиг EOF, используйте after для повторного вызова этой функции через несколько миллисекунд.Когда он достигает EOF, он перестает называть себя.Это означает, что вам не нужно создавать свой потенциально бесконечный цикл, а цикл событий гарантированно будет введен один раз за итерацию.Как только этот EOF обнаружен, вы можете вызвать функцию (снова используя after), чтобы выполнить окончательную обработку.

...