2016-08-23 15 views
1

私は、Webサイトをスクラップし、見つかったときにファイルをダウンロードするプログラムを持っています。多くの場合、それは正常に動作しますが、シーケンスの検索が終了する前に、プログラムの動作を終了させる場合もあります。私は困惑している。検索中にのみダウンロード中は終了しません。私は現在、ソケットエラーの問題を推測していますが、上記のように私は困惑しています。私はhttperrorチェックを入れて、何もHTTPエラーコードのために表示されません。私は今ソケットエラーチェックを挿入しようとしているし、それはさらに狂った取得します。ソケットエラーチェックのために何かを追加する前に、正常に動作します。一度ソケットエラーをチェックすると、プログラムは実行されません。これは、IDLEディスプレイを表示し、IDLEが次のコマンドを待っているのと同じように、カーソルを表示します。それ以外の場合、ソケットのエラーチェックを行わずに、tkinterウィンドウがシャットダウンする(errプログラムが予期せず終了する)までプログラムが実行されていることを示します。 tkinterウィンドウがシャットダウンしても、IDLEのエラーは発生しません。Pythonプログラムが予期せず終了する

なぜこのプログラムが早期に終了していて、それをトラップできるので、終了せずに戻って同じWebアドレスをもう一度やり直すべきかを知るためには何が必要ですか?私は同じWebアドレスの世話をして再実行したと思いますが、ソケットエラーの問題があっても、ソケットエラー処理は正しくありません。私は困惑している。私は問題はTkinterのに起因していると思い

#!/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

で終わる置き換えチャンクが続く#-と変更された行を示していますstacktraceでのエラーメッセージエラーがなければ、どうすればあなたを助けることができますか? –

+0

@MoinuddinQuadri "tkinterウィンドウがシャットダウンした場合、IDLE **にエラーは発生しません。"持っているべき誤りはなかった。 –

+0

この問題はtkinterが 'mainloop()'を起動していないことが原因であると考えています。関数の中で 'while'ループの中にコードを置き、' root.after 'メソッド。 –

答えて

1

が、それはあなたが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

私はそれが働いているかどうかを確認するために、今後数日間にわたってテストを行います。それは問題を解決したように見えますが、プログラムを1回実行するだけでは確実にはわかりません。それがうまく動作する前に、うまくいけば、それは窒息するでしょう。私はあなたがなぜhttperror Fileupdateの行を除いて削除したのか分かり始めたら、私は自分の間違いを訂正する必要がありました。 OOPS私のミス私はそれを必要と思ってそれを残し、代わりにすべてが1つではなく2つ増えた、私を愚かにした。 – confused

+0

テストは素晴らしいですが、ある時点であなたはおそらくそれについて自信を持って感じるでしょうし、私はあなたがこれを受け入れることを期待しています。私はこれをより一貫して動作させるために保証して、アプリケーションをスムーズに動かすために必要なものすべてを実行するわけではないので、時々、 'update_idletasks'を実行する独自のループを実装します。また、私は 'httperror'以外のコードを間違い、余分な(反復的な)ノイズと呼んでいません。 –

+0

McDonalds-Jensen今私は気づいているのは、プログラムをロックしていることです。それは私にプログラムミドルプログラムの実行を止めるどんな種類のエラーも与えません。私が問題に遭遇したことのないもう一つの事は、プログラムがファイル全体をダウンロードしていないことでした。今では、ファイルの一部をダウンロードするだけです(通常はファイル全体をダウンロードするときもあります)。一般に、ファイルの一部がダウンロードされると、すぐにロックされ、何もしません。 – confused

関連する問題