ボタンを押下してファイルチェックの処理を走らせて、条件を満たしたところでブラウザを開く処理を開始したいのですが、以下のコードを実行するとなぜかブラウザが途中で落ちてしまいます。
(おそらくbreakになったところで落としている?)
無駄にループを回さないほうが良いかと思い、breakしているのですがこのような書き方は間違っているのでしょうか?
#サーバへ接続 conn = SMBConnection( '<ユーザー名>', '<パスワード>', platform.uname().node, '<サーバ名>') conn.connect('<IPアドレス>', 139) #ファイルを生成 ・ ・(パス、ファイル名割愛) ・ sender_path = os.path.join(svrpath, file_name) chk_path1 = os.path.join(svrpath_s, file_name_s) chk_path2 = os.path.join(svrpath_f, file_name_f) #print(sender_path) open(sender_path,'w') # clickイベント def btn_click3(): root = tkinter.Tk() root.title('このウインドウは自動的に閉じます') root.geometry("350x40") #ラベル Static1 = tkinter.Label(text=u'処理完了後に自動的にブラウザが立ち上がります。') Static1.pack() #5秒後にウインドウを閉じる root.after(3000, lambda: root.destroy()) root.mainloop() num = 0 bool1 = True while( not( os.path.isfile(chk_path1))): time.sleep(1) num += 1 bool1 = True print(num) if num < 120 and os.path.isfile(chk_path1): os.remove(chk_path1) bool1 = True break elif num == 120 and os.path.isfile(chk_path2): os.remove(chk_path2) bool1 = False break elif num > 120: bool1 = False break if bool1 == True: print(bool1) open_edge() else: print(bool1) sorry_message() def open_edge(): browser = webdriver.Edge(r"C:\edgedriver_win64\msedgedriver.exe") browser.get('https://www.yahoo.co.jp') def sorry_message(): root = tkinter.Tk() root.title('テスト') root.geometry("350x40") #ラベル Static1 = tkinter.Label(text=u'失敗') Static1.pack() #5秒後にウインドウを閉じる root.after(5000, lambda: root.destroy()) root.mainloop() #ファイルの存在チェック is_file = os.path.isfile(sender_path) if is_file: print(f"{sender_path} is a file.") else: #pass # パスが存在しないかファイルではない print(f"{sender_path2} is a file.") print(conn.echo('echo success')) conn.close()
btn_click3()の仕様をご提示ください。
また、btn_click3()の最後の if bool1 == True 以下の処理は、while内部の処理になっているように見えますが、正しいのでしょうか?
ありがとうございます。
ファイルチェックのプログラムです。
1.120秒以内に目的のファイルが生成出来たらファイルを消してブラウザを開く
2.120秒経過して失敗時用のファイルが出来ていたらファイルを消して失敗メッセージを表示
3.120秒経過して何もファイルが出来なかったら失敗メッセージを表示
whileの外にしたいのですが、インデントがおかしいと表示されまして・・・今の形になっています。
まずは、while の外に出す必要があるかと。
現状では、毎秒、open_edgt() が呼ばれますし、逆に、呼ぶべきタイミングで open_edgt() が呼ばれません。
bool1 = True を、while の上にも記述したら、「インデントが~」が消えませんか?
num = 0
bool1 = True
while( not( os.path.isfile(chk_path1))):
time.sleep(1)
num += 1
bool1 = True
print(num)
if num < 120 and os.path.isfile(chk_path1):
os.remove(chk_path1)
bool1 = True
break
elif num == 120 and os.path.isfile(chk_path2):
os.remove(chk_path2)
bool1 = False
break
elif num > 120:
bool1 = False
break
if bool1 == True:
print(bool1)
open_edge()
else:
print(bool1)
sorry_message()
def open_edge():
修正依頼に書いたらインデントが消えてしまいましたが・・・
ご教示いただいた通り、bool1 = Trueの位置をwhileの上に追記およびif bool1 == True:を1タブ分左にずらしました。
それでインデントのエラーは無いのですが、ブラウザが落ちる症状は変わりませんでした。。。
質問は修正できますので、コードに関しては、質問の修正をお願いします。
落ちるタイミングを正確に確認してください。
キー待ちなり、デバッグなり、Dialogなりを使って、落ちる位置を割り出してください。
ひとつひとつ実行をしてデバッグをしてみたところ、conn.close()をした瞬間にブラウザが落ちました。
プログラムの実行は終了してもブラウザは表示させたままにしたいのですが・・・
どのように対処したらよいのか理解が出来ておりません。。。
実行終了しても表示したいとなると、考え方から変えないとできません。
現状のやり方を基にするなら、ブラウザが閉じられるまで、このプログラムが裏に隠れている状態にするくらいでしょうか。
https://pcl.solima.net/pyblog/archives/468
これを参考にして、open_edge()をdaemon = Falseで呼べば、実現できる可能性があります。子プロセスの実行が禁止されるので、webdriver.Edge()でエラーが出そうな気もしますが。
browser = webdriver.Edge(r"C:\edgedriver_win64\msedgedriver.exe")
browser.get('https://www.yahoo.co.jp')
root2 = tkinter.Tk()
root2.title('ブラウザ起動中')
root2.geometry("350x35")
#ラベル
Static2 = tkinter.Label(text=u'閉じる')
Static2.pack()
root2.after(5000, lambda: root.destroy())
root2.mainloop()
正しいのか分かっていないのですが、このようにすることで逃げる(??)ことが出来たので対応してみました。
あなたの回答
tips
プレビュー