teratail header banner
teratail header banner
質問するログイン新規登録
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

251閲覧

Python Tkinter 停止されない原因

kashinomori

総合スコア16

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2025/07/03 08:46

0

0

実現したいこと

以下のコードを実施した際、停止ボタンを押下したら最後のprint文は実行せずに終了させたいです。
つまり、ボタン押下と同時に終了させたいのですが、どこが誤っているのでしょうか。初学者につきあまいところあるかと思います、お手柔らかにどうぞよろしくお願いいたします。

発生している問題・分からないこと

以下のコードを実施した際、停止ボタンを押下したら最後のprint文は実行せずに終了させたいです。

エラーメッセージ

error

1以下のコードを実施した際、停止ボタンを押下したら最後のprint文は実行せずに終了させたいです。

該当のソースコード

import tkinter import os import tkinter.font as font import sys from tkinter import ttk import time window=tkinter.Tk()#枠をつくる window.title("実行結果") window.geometry("500x600+300+300") window.resizable(0,0) window.attributes("-topmost", True) def button1_function(): pass window.destroy() def button2_function(): sys.exit exit() time.sleep(3) window.destroy() button1=tkinter.Button(window, text="承認する", command=button1_function) button1.place(x=150, y=570) button2=tkinter.Button(window, text="訂正する", command=button2_function) button2.place(x=300, y=570) window.mainloop()#繰り返す表示させるために絶対必要 print('まだ停止されていない')

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

どうしてもprint文が実行されてしまいます。

補足

特になし

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

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

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

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

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

melian

2025/07/03 09:04

「停止ボタン」というのは具体的に何を指していますでしょうか? 「承認する」ボタンなのか、それともウィンドウのクローズボタンでしょうか?
meg_

2025/07/03 09:04

> 以下のコードを実施した際、停止ボタンを押下したら最後のprint文は実行せずに終了させたいです。 「停止ボタン」は見当たらないです。コードは合っていますか?
kashinomori

2025/07/03 09:44

毎度ありがとうございます。失礼いたしました。以下の訂正するボタンとなります。sys.exitで終了する認識です。 def button2_function(): sys.exit exit() time.sleep(3) window.destroy()
melian

2025/07/03 09:52

それでしたら、 sys.exit() とすればよいです。(sys.exit メソッドを実行するので "()" を付ける必要があります)
TakaiY

2025/07/03 10:21

tkinterのmainloopの後にある処理を動かしたくないということのようですが、通常の利用方法ではありません。 そのようにしたいのはなぜですか?
kashinomori

2025/07/04 10:40

melian様、どうもありがとうございます。そちらを入れて実行かけましたが、以下のエラーメッセージがでてtkinter画面もフリーズしてしまいます。 ↓↓抜粋 def button2_function(): sys.exit() time.sleep(3) window.destroy() An exception has occurred, use %tb to see the full traceback. SystemExit C:\Users\2#######: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D. warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
kashinomori

2025/07/04 10:43

TakaiY様、いつもありがとう mainloop後の処理は実際にはwebを開いて動作するコードがあります。mainloopの記述はこれらのwebの動作が終わった一番最後に記述する必要がありますでしょうか?*それをしたうえでも上記と同様のエラー結果となりました。
meg_

2025/07/04 10:48

> sys.exit() 上記に変更することで私の環境ではエラーは出ず終了しました。どういう環境でPyhon実行していますか?
kashinomori

2025/07/04 11:12

ありがとございます。jupyternotebookとなります。対話型ですとうまく動作がされないのでしょうか。。
TakaiY

2025/07/04 11:50 編集

> mainloop後の処理は実際にはwebを開いて動作するコードがあります。 で、mainloop後の処理はどのように動かしたいのですか? GUIのアプリケーションは通常、mainloopが終了すればアプリも終了させるのが通常の動作です。 XY問題のような気がするので、そもそも全体として動作をさせたいのか説明していただくのがいいような気がします。 前にも書きましたが、ボタンを押すとsys.exit()が呼ばれて終了するというのは、tkinterのプログラムではあまりやらない手です。
YAmaGNZ

2025/07/04 11:33

「訂正する」ボタンを押したときに後の処理を行いたくないからそこで強制終了したいということですよね? そうなのであれば「承認する」ボタンが押された時に行いたい処理を実行すればいいのではないですか?
meg_

2025/07/04 11:40

> jupyternotebookとなります。対話型ですとうまく動作がされないのでしょうか。。 そうかもしれません。pyファイルが良いと思います。
TakaiY

2025/07/04 11:53

> 「訂正する」ボタンを押したときに後の処理を行いたくないからそこで強制終了したいということですよね? であれば、フラグを立てるなどして動作を制御したほうがよさそうだし、mainloopが終了しているので、その処理の後終ってしまうのはどう?とか、そもそも、その処理はループの中で動かすべきではとか。
kashinomori

2025/07/04 12:31

meg様、ありがとうございます。sys.exit()はそういうことなのですね。どちらにせよexe化して配布予定だったのでpy.fileでも試してみます。 TakaiY様、はい、その通りそこで強制終了させたいです。すみません、私の理解が至らず返答いただいた内容まで把握できませんでした。
melian

2025/07/04 12:42

> jupyternotebookとなります。対話型ですとうまく動作がされないのでしょうか。。 Jupyter Notebookの場合、カーネルに IPython を利用しています。コマンドラインで ipython を起動して sys.exit() を実行すると、同じエラーが発生することが判るかと思います。 $ ipython Python 3.12.7 (main, Jun 18 2025, 13:16:51) [GCC 14.2.0] In [1]: import sys In [2]: sys.exit() An exception has occurred, use %tb to see the full traceback. SystemExit .../IPython/core/interactiveshell.py:3680: UserWarning: To exit: use 'exit', 'quit', or Ctrl-D. warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
melian

2025/07/04 15:46

.py ファイルで試すとのことですので余談になりますが、前述のエラーメッセージに "An exception has occurred, ... SystemExit" と表示されていますので、これを利用してもよいかと思います。(try 〜 except で SystemExit 例外を補足) def button2_function():  window.destroy()  raise SystemExit    : try:  window.mainloop()  print('まだ停止されていない') except SystemExit:  pass ※ コメント欄ではインデントのタブやスペースが無視されてしまうので、いわゆる全角スペース(U+2000)で代用しています
kashinomori

2025/07/05 00:15

melian様、毎度どうもありがとうございます。詳細まで教えていただきありがとうございます。pyファイルにてsys.exit()で実行できる点、申し訳ございませんがベストアンサーにてお願いできますでしょうか?なおraise SystemExit下の:はタイポでしょうか?実行してもIndentationError: unexpected indentとでております。なくした状態で実行するとボタンが表示されなくなりました。 def button2_function(): window.destroy() raise SystemExit try: window.mainloop() print('まだ停止されていない') except SystemExit: pass button1=tkinter.Button(window, text="承認する", command=button1_function) button1.place(x=150, y=570) button2=tkinter.Button(window, text="訂正する", command=button2_function) button2.place(x=300, y=570) print('まだ停止されていない') window.mainloop()#繰り返す表示させるために絶対必要    
melian

2025/07/05 00:47

> raise SystemExit下の:はタイポでしょうか? 前述のコメントで申し上げた通り、全角スペースでインデントを代用しています。 > ※ コメント欄ではインデントのタブやスペースが無視されてしまうので、いわゆる全角スペース(U+2000)で代用しています なので、全角スペースの部分をスペースかタブに置き換えてください。 > ベストアンサーにてお願いできますでしょうか? YAmaGNZ さんの回答がベストアンサーでよいのではないでしょうか。
YAmaGNZ

2025/07/05 02:19 編集

> raise SystemExit下の:はタイポでしょうか? 正式なコードではなく中略といった意味じゃないでしょうか。 button1等の定義部分は書かなくても同じだから省略したということでしょう。
guest

回答1

0

ベストアンサー

sys.exit()が思った動作をしていないというのも問題ではあるかと思いますが本質は「承認する」ボタンを押したときのみ処理を行いたいということなのではないですか?

button1_functionで行いたい処理を実行するように書けばbutton2_functionで強制終了する必要もないのではないですか?

python

1import tkinter 2import os 3import tkinter.font as font 4import sys 5from tkinter import ttk 6import time 7 8window=tkinter.Tk()#枠をつくる 9window.title("実行結果") 10window.geometry("500x600+300+300") 11window.resizable(0,0) 12window.attributes("-topmost", True) 13 14def button1_function(): 15 pass 16 window.destroy() 17 # print('まだ停止されていない') 18 # ここでやらない理由があるのでしょうか? 19 20def button2_function(): 21 time.sleep(3) 22 window.destroy() 23 24 25button1=tkinter.Button(window, text="承認する", command=button1_function) 26button1.place(x=150, y=570) 27button2=tkinter.Button(window, text="訂正する", command=button2_function) 28button2.place(x=300, y=570) 29window.mainloop()#繰り返す表示させるために絶対必要 30 31 32# print('まだ停止されていない') 33# もしどちらのボタンが押された時でも実行したいことがあるならここに書けばいいんじゃないですか?

投稿2025/07/04 22:20

YAmaGNZ

総合スコア10674

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

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

kashinomori

2025/07/05 04:29

皆様、お忙しい中でどうもありがとうございました。本件closeにてよろしくお願い申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問