2011-05-06 42 views
2

嗨 我做了一個音樂下載程序,它的效果很好,它會告訴你它完成的百分比,然後如果我移動窗口,它會停止下載。 我做了一個不同的小腳本,可以在網上下載指定的mp3,我可以根據需要隨意移動它,並且它不會停下來。當你移動Tkinter窗口停止程序

我沒有提出代碼的唯一原因是它非常長。它大約有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

所以......你向我們展示了一個可行的程序,並且我們應該猜測你沒有向我們展示的程序是如何失敗的? – 2011-05-06 11:01:23

回答

2

最有可能的問題是,因爲你在呼喚update。除非你確切地知道分歧是什麼,否則你永遠不應該那樣做。 update會導致輸入新的事件循環。實質上,你最終會在無限循環內形成一個無限循環。

嘗試將您的update更改爲update_idletasks,看看是否可以解決您的問題。這種update的變化只處理「閒置」事件,如屏幕重繪,並且不太可能導致問題。

此外,您絕對不需要「更新;插入;刪除;更新」。這不會有任何明顯的影響。刪除後只需撥打update_idletasks即可。

最後,您可以通過重新排列代碼來完全避免使用update_idletasks。編寫一個讀取單個數據塊並更新進度條的函數。然後,如果它尚未達到EOF,則使用after在幾毫秒後再次調用該函數。當它到達EOF時,它停止調用它自己。這樣做意味着您不必創建自己的潛在無限循環,並且事件循環保證每次迭代輸入一次。一旦檢測到EOF,您可以調用函數(再次使用after)進行任何最終處理。