質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

5138閲覧

Python3 で mainloop()を抜ける方法がわからない

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/01/01 09:37

前提・実現したいこと

ここに質問の内容を詳しく書いてください。ボールドテキスト
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

python3でマルチスレッドを使って tkinter のプログレスバーを作っています。
かなりいいところまで来た感じなのですが、重い処理が終了した時点でのプログレスバーの止め方がわかりません。

下のコードで言うと、stop_flg が True になったことは捕捉できたのですが、スレッドがどうしても止まってくれません。

プログレスバーが表示されているフレームの「×」をクリックした時に起こることを python のコードで実現したいと思っているのですが、そのやり方がわかりません。

エラーメッセージ

該当のソースコード

import time import concurrent.futures import paramiko import scp import sys from tkinter import * import tkinter.ttk as ttk stop_flg = False def func1(): remoteDir = '/volume1/web/sample' with paramiko.SSHClient() as ssh: ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname='192.168.0.x', port=22, username='user', password='pass') with scp.SCPClient(ssh.get_transport()) as scpc: scpc.get( remote_path = remoteDir, local_path = '/home/user/temp, recursive = True) global stop_flg stop_flg = True func2().stop() def func2(): app = Tk() pbIndeterminateVer = ttk.Progressbar(orient=HORIZONTAL, length=200, mode='indeterminate') pbIndeterminateVer.pack(side="left") pbIndeterminateVer.start(10) app.geometry("200x40") app.title("download") print(stop_flg) if stop_flg == True: print('stop_flg is true') quit = True app.mainloop() if __name__ == "__main__": quit = False executor = concurrent.futures.ThreadPoolExecutor(max_workers=2) executor.submit(func1) executor.submit(func2) exit()

試したこと

app.destroy()
sys.exit()
os.exit()
os.kill(os.getpid(), signal.SIGKILL)

すべてダメでした。
そもそも不可能なことをやろうとしているんでしょうか?

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

投稿してから数時間かかって何とか動くようにはなりました。
昨日の朝から合計15時間以上・100個くらいのプログラムを書いて、もう自分の能力では無理と考え投稿させて頂きましたが一応できました。


import time import concurrent.futures import paramiko import scp import sys from tkinter import * from tkinter import ttk root = Tk() def func1(): remoteDir = '/volume1/web/sample' with paramiko.SSHClient() as ssh: ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname='192.168.0.x', port=22, username='user', password='pass') with scp.SCPClient(ssh.get_transport()) as scpc: scpc.get( remote_path = remoteDir, local_path = '/home/user/temp, recursive = True) root.destroy() def func2(): pbIndeterminateVer = ttk.Progressbar(orient=HORIZONTAL, length=200, mode='indeterminate') pbIndeterminateVer.pack(side="left") pbIndeterminateVer.start(10) root.geometry("200x40") root.title("download") root.mainloop() if __name__ == "__main__": executor = concurrent.futures.ThreadPoolExecutor(max_workers=2) executor.submit(func1) func2() exit()

要するにやったことは、func2 をマルチスレッドから出したことでした。
どうしてこれでうまくいくのかわかりませんが、ネットでは2つのプログラムのうち1つをメインにいれ、もう1つはマルチスレッドで処理するようなサイトがあったので試してみたところうまくいきました。

お騒がせしました。

投稿2020/01/01 16:21

編集2020/01/01 16:29
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問