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

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

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

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

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

1回答

2724閲覧

tkinterのボタンをクリックしても コマンドが 実行されない

Reach

総合スコア733

Python 3.x

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

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/05/06 09:10

編集2018/05/06 10:00

Python で 困っております

Htmlを 取得して それを 加工して ファイルに書き出す コードを 作成しております

実行を 中断できるように tkinterのボタンを クリックした際に
sys.exit() を 実行させたいのですが クリックしても
スクリプトが 終了しません

ボタンクリック時の動作だけのコードでは 正常に機能します

どのような 解決方法が ありますでしょうか?

書き遅れましたが 処理中断時には 
ファイルを閉じ、 self.root.destroy() sys.exit() を実行させたいですが
このような場合は ProcessPoolExecutor で よいのでしょうか?
また、ファイルをクローズするので ファイル破損対策の処理は 記述しなくても よいのでしょうか?

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

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

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

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

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

guest

回答1

0

過去の質問で参考になるもの→wxpythonでボタンなどからイベント実行後、GUIをフリーズさせたくない

◇キャンセルの要件によるのですが、
スクリプトを終了したい=sys.exit()ならば、ボタン実行時の処理をTreadまたはThreadPoolExecutorに流す形にすれば良いかと。

要件が変わってsys.exit()ではなく一連の処理(タスク)を途中でキャンセルしたくなったらProcessPoolExecutorになります。

そして、ファイルの書き出し部分に関しては外部からキャンセルされてもファイル内容が破損しないように
tempファイルos.replaceを使ったアトミックな書き出し処理に変更してくださいな。


厳密にキャンセルしている訳ではないですが、ブロッキングの方だけ回避する方法を。
1,executor.submitで別タスクを実行
2,閉じるボタンやexitボタンを押下した時は、画面を非表示(withdraw)にする。

以下のコードはmax_workers=1に指定しているので、並列度が1です、
この場合だと同じファイルでも並列に実行されることが起こりえないため問題ないかと。

ProcessPoolExecutorの

Python

1# -*- coding: utf-8 -*- 2from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor, Future, as_completed 3from contextlib import closing 4from threading import current_thread, get_ident 5from random import randint 6import tkinter as tk 7import sys 8from time import sleep 9import requests 10 11 12def on_application_exit(): 13 # Windowを閉じた時に行いたい処理 14 sys.exit(0) 15 16 17# max_workersは並列度 18executor = ProcessPoolExecutor(max_workers=1) 19 20 21def hard_task(url: str, seconds: int): 22 print(f'tid:{get_ident()}, {current_thread().getName()}, {seconds}') 23 sleep(seconds) 24 print(f'Wake up{seconds}') 25 r = requests.get(url) 26 # os.replaceを使ってアトミックに書き出してくださいな。 27 with open('yahoo.txt', 'a') as f: 28 f.write(r.text) 29 30 31class MyFrame(tk.Frame): 32 def __init__(self, root): 33 super().__init__(root) 34 self.pack() 35 self.btn_task = tk.Button(self, text='task', command=self.task) 36 self.btn_task.pack() 37 self.btn_exit = tk.Button(self, text='exit', command=on_application_exit) 38 self.btn_exit.pack() 39 40 def close(self): 41 self.master.withdraw() 42 43 def task(self): 44 seconds = randint(2, 5) 45 url = 'https://www.yahoo.co.jp' 46 task = executor.submit(hard_task, url, seconds) 47 48 49def main() ->None: 50 root = tk.Tk() 51 root.title("ProcessPoolExecutor") 52 root.protocol("WM_DELETE_WINDOW", on_application_exit) 53 root.geometry("400x200") 54 with closing(MyFrame(root)) as f: 55 root.mainloop() 56 57 58if __name__ == '__main__': 59 main() 60

投稿2018/05/06 09:31

編集2018/05/06 14:07
umyu

総合スコア5846

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

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

Reach

2018/05/06 09:50

早速の回答 ありがとうございます 書き遅れましたが 処理中断時には  ファイルを閉じ、 self.root.destroy() sys.exit() を実行させたいですが このような場合は ProcessPoolExecutor で よいのでしょうか? また、ファイルをクローズするので ファイル破損対策の処理は 記述しなくても よいのでしょうか?
umyu

2018/05/06 09:54

>VBA_Macroさんへ 回答のコメント欄ではなく、この質問を見ている他の人にも分かるように。質問文の本文を変更して頂けませんか。
Reach

2018/05/06 10:02

申し訳 ありません 本文に 加筆いたしました
umyu

2018/05/06 14:08

>VBA_Macroさんへ 質問文への加筆ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問