実現したいこと
以下のコードを実施した際、停止ボタンを押下したら最後の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文が実行されてしまいます。
補足
特になし
「停止ボタン」というのは具体的に何を指していますでしょうか? 「承認する」ボタンなのか、それともウィンドウのクローズボタンでしょうか?
> 以下のコードを実施した際、停止ボタンを押下したら最後のprint文は実行せずに終了させたいです。
「停止ボタン」は見当たらないです。コードは合っていますか?
毎度ありがとうございます。失礼いたしました。以下の訂正するボタンとなります。sys.exitで終了する認識です。
def button2_function():
sys.exit
exit()
time.sleep(3)
window.destroy()
それでしたら、
sys.exit()
とすればよいです。(sys.exit メソッドを実行するので "()" を付ける必要があります)
tkinterのmainloopの後にある処理を動かしたくないということのようですが、通常の利用方法ではありません。
そのようにしたいのはなぜですか?
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)
TakaiY様、いつもありがとう
mainloop後の処理は実際にはwebを開いて動作するコードがあります。mainloopの記述はこれらのwebの動作が終わった一番最後に記述する必要がありますでしょうか?*それをしたうえでも上記と同様のエラー結果となりました。
> sys.exit()
上記に変更することで私の環境ではエラーは出ず終了しました。どういう環境でPyhon実行していますか?
ありがとございます。jupyternotebookとなります。対話型ですとうまく動作がされないのでしょうか。。
> mainloop後の処理は実際にはwebを開いて動作するコードがあります。
で、mainloop後の処理はどのように動かしたいのですか?
GUIのアプリケーションは通常、mainloopが終了すればアプリも終了させるのが通常の動作です。
XY問題のような気がするので、そもそも全体として動作をさせたいのか説明していただくのがいいような気がします。
前にも書きましたが、ボタンを押すとsys.exit()が呼ばれて終了するというのは、tkinterのプログラムではあまりやらない手です。
「訂正する」ボタンを押したときに後の処理を行いたくないからそこで強制終了したいということですよね?
そうなのであれば「承認する」ボタンが押された時に行いたい処理を実行すればいいのではないですか?
> jupyternotebookとなります。対話型ですとうまく動作がされないのでしょうか。。
そうかもしれません。pyファイルが良いと思います。
> 「訂正する」ボタンを押したときに後の処理を行いたくないからそこで強制終了したいということですよね?
であれば、フラグを立てるなどして動作を制御したほうがよさそうだし、mainloopが終了しているので、その処理の後終ってしまうのはどう?とか、そもそも、その処理はループの中で動かすべきではとか。
meg様、ありがとうございます。sys.exit()はそういうことなのですね。どちらにせよexe化して配布予定だったのでpy.fileでも試してみます。
TakaiY様、はい、その通りそこで強制終了させたいです。すみません、私の理解が至らず返答いただいた内容まで把握できませんでした。
> 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)
.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)で代用しています
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()#繰り返す表示させるために絶対必要
> raise SystemExit下の:はタイポでしょうか?
前述のコメントで申し上げた通り、全角スペースでインデントを代用しています。
> ※ コメント欄ではインデントのタブやスペースが無視されてしまうので、いわゆる全角スペース(U+2000)で代用しています
なので、全角スペースの部分をスペースかタブに置き換えてください。
> ベストアンサーにてお願いできますでしょうか?
YAmaGNZ さんの回答がベストアンサーでよいのではないでしょうか。
> raise SystemExit下の:はタイポでしょうか?
正式なコードではなく中略といった意味じゃないでしょうか。
button1等の定義部分は書かなくても同じだから省略したということでしょう。

回答1件
あなたの回答
tips
プレビュー