2016-08-23 294 views
1

我有一個程序,該程序會在發現網站時下載並下載文件。通常它運行得很好,但在其他時候,它會在程序完成搜索序列之前終止程序的運行。我很難過。它只有在搜索時纔會退出。我目前猜測一個套接字錯誤的問題,但正如我上面說的,我很難過。我已經放入了httperror檢查,並且沒有顯示任何http錯誤代碼。我現在試圖插入套接字錯誤檢查,它變得更瘋狂。在爲套接字錯誤檢查添加任何東西之前,它工作正常。一旦我添加套接字錯誤檢查程序將不會運行。它調出IDLE顯示並顯示光標,如IDLE已準備好並等待下一個命令。否則,如果沒有套接字錯誤檢查,則表明程序正在運行,直到tkinter窗口關閉(err程序意外終止)。如果tkinter窗口關閉,它不會在IDLE上發生任何錯誤。Python程序意外終止

我需要做些什麼來找出爲什麼這個程序有時會提前終止,並能夠將它攔截出來,這樣它就不會終止,而只是返回並重新運行同一個Web地址。我想我重新運行相同的網址照顧,但我沒有處理正確的套接字錯誤,如果它甚至是套接字錯誤的麻煩。我很難過。

#!/usr/bin/python3.4 

import urllib.request 
import os 
from tkinter import * 
import time 
import urllib.error 
import errno 

root = Tk() 
root.title("photodownloader") 
root.geometry("200x200") 

app = Frame(root) 
app.grid() 

os.chdir('/home/someone/somewhere/') 
Fileupdate = 10000 
Filecount = 19999 
while Fileupdate <= Filecount: 
     try: 
       root.title(Fileupdate) 
       url = 'http://www.webpage.com/photos/'+str(Fileupdate)+'.jpg' 
       a = urllib.request.urlopen(url) 
       urllib.request.urlretrieve(url, str(Fileupdate)+'.jpg') 
     except urllib.error.HTTPError as err: 
       if err.code == 404: 
         Fileupdate = Fileupdate + 1 
         root.update_idletasks() 
         continue 
       else: 
         print(err.code) 
         Fileupdate = Fileupdate + 1 
         root.update_idletasks() 
         continue 
     except socket.error, v: 
       print(Fileupdate, v[0]) 
       continue 

     Fileupdate = Fileupdate+1 
     root.update_idletasks() 
+0

也請分享結束塊帶有堆棧跟蹤的錯誤消息。沒有錯誤,我們可以如何幫助你? –

+0

@MoinuddinQuadri「如果tkinter窗口關閉,它不會給IDLE **上的任何錯誤。」沒有錯誤可以得到。 –

+0

我假設這個問題是由tkinter從不開始它的'mainloop()'引起的,有一點需要嘗試的是將代碼放在你的while循環中而不是在函數中,偶爾用'root.after '方法。 –

回答

1

我認爲這個問題是由Tkinter的引起了不給啓動它的主事件循環是指呼叫root.mainloop()做的機會,我建議讓您目前在while循環的代碼,而不是要用root.after()方法定期調用的函數。我已經包含了一個潛在的變化來測試這是否能解決這個問題。

注意,行:

    Fileupdate = Fileupdate + 1 
        root.update_idletasks() 
        continue 
在一些

除了分支是多餘的,因爲如果代碼繼續去反正會發生,所以修改代碼的功能工作的一部分是簡單地擺脫那些部分。這是我想你嘗試運行從原來的while語句啓動代碼:

#-while Fileupdate <= Filecount: 
def UPDATE_SOCKET(): 
    global Fileupdate #allow the global variable to be changed 
    if Fileupdate <= Filecount: 
#/+ 
     try: 
       root.title(Fileupdate) 
       url = 'http://www.webpage.com/photos/'+str(Fileupdate)+'.jpg' 
       a = urllib.request.urlopen(url) 
       urllib.request.urlretrieve(url, str(Fileupdate)+'.jpg') 
     except urllib.error.HTTPError as err: 
       #<large redundant section removed> 
       print("error code",err.code) 
     except socket.error as v: 
       print("socket error",Fileupdate, v[0]) 
#-    continue 
       root.after(500, UPDATE_SOCKET) 
       return 
#/+ 


     Fileupdate = Fileupdate+1 
#-  root.update_idletasks() 
     root.after(100, UPDATE_SOCKET) #after 100 milliseconds call the function again 
     #change 100 to a smaller time to call this more frequently. 


root.after(0,UPDATE_SOCKET) #when it has a chance, call the update for first time 

root.mainloop() #enter main event loop 
#/+ 

我表示改變線路用#-其次是替換它與#/+

+0

我會在接下來的幾天對它進行測試,以確認它是否仍在工作。它看起來似乎解決了這個問題,但無法確定一個程序的運行情況。在其他時候有時很好,但它會窒息。一旦我開始意識到爲什麼除了httperror Fileupdate行之外,我必須糾正自己的錯誤。 OOPS是我的錯誤,我把它留在想我會需要它的地方,而是讓所有東西都增加了兩個而不是一個,啞巴我。 – confused

+0

測試很棒,在某些時候您可能會對此感到自信,我希望您能夠接受這一點,然後才能接受。我可以保證這個工作更加一致,然後實現你自己的循環,它偶爾會做'update_idletasks',因爲它不會做所有必要的事情來保持應用程序的順利運行。此外,我不會在'除了httperror'錯誤的代碼,只是額外的(重複)噪音 –

+0

麥當勞 - 詹森我注意到的一件事現在它鎖定了程序。它不會給我任何形式的錯誤,只會停止程序中間程序的執行。我從來沒有遇到過的其他問題是程序沒有下載整個文件。現在它只會下載一小段文件,有時(下載整個文件的時間),通常只要下載一部分文件,它就會鎖定在我身上,而不會執行其他任何操作。 – confused