2016-08-23 298 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