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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Tkinter

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

Q&A

解決済

3回答

4849閲覧

tkinterでのWhileループ脱出方法

mikami_r

総合スコア13

Tkinter

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

0グッド

0クリップ

投稿2020/10/23 05:06

編集2020/10/23 05:20

Pythonのtkinterにてアプリケーションを作成中ですが、
作成途中の検討段階でWhileのループから抜け出せなくなりました。

ソースコードは下記です。
希望としては下記コードのfinish_buttonでループを止めたいです。

python

1 2import os 3import shutil 4import openpyxl as px 5import tkinter 6from tkinter import messagebox 7import numpy as np 8import cv2 9import pyautogui as pag 10import time 11 12#ユーザーフォーム画面作成 13root = tkinter.Tk()# Tkクラス生成 14root.geometry('300x60')# 画面サイズ 15root.title('PC操作画面録画App')# 画面タイトル 16val = tkinter.IntVar()#IntVarオブジェクトを作成して変数に代入 17 18#Printsc保管先フォルダ設定 19timestr=time.strftime("%Y%m%d-%H%M%S") #年月日時を取得 20img_dir_name="./formovie"+timestr #フォルダ名称の定義 21os.makedirs(img_dir_name, exist_ok=True) #画像保存用フォルダを作成 22 23#Printscのショット枚数初期値定義 24psc = 1 25 26#Printscのショットクリア定義 27psc_stop = 0 28 29#画面録画開始の関数 30def start(): 31 messagebox.showinfo('start',"画面録画開始します") 32 print("start") 33 global psc #変数pstはグローバル関数であることを宣言。 34 global psc_stop #変数pst_stopはグローバル関数であることを宣言。 35 36 while psc >= 1 : 37 38 print(psc) 39 psc = psc + 1 40 time.sleep(1) 41 if psc_stop == 1: 42 break 43 44 45 46#画面録画終了の関数 47def finish(): 48 global psc_stop #変数pstはグローバル関数であることを宣言。 49 psc_stop = 1 50 messagebox.showinfo('finish',"画面録画終了します") 51 print("finish") 52 53#開始ボタンの作成、配置、動作の登録 54start_button = tkinter.Button(root,text="START",command=start).pack() 55 56#終了ボタンの作成、配置、動作の登録 57finish_button = tkinter.Button(root,text="FINISH",command=finish).pack() 58 59tkinter.mainloop() #作成ウインドの表示と維持

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

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

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

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

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

dodox86

2020/10/23 05:13 編集

Pythonはインデント(字下げ)がとても大事なプログラミング言語です。質問文にコードをただ張り付けるとインデントが崩れ、読みづらくなり、それだけ回答も離れがちになります。その他、'#'のコメント部分が見出し扱いになっちゃっていますね。コードはマークダウン記法を用いて読みやすくするようにしてください。 https://teratail.com/help/question-tips#questionTips3-5-1 https://teratail.com/questions/238564 あたりを参考にしてソースコードを適切に表示するようにしてください。
mikami_r

2020/10/23 05:21

ご指摘御礼申し上げます。 コードの貼付け方法を変更させていただきました。 引き続きご教授頂けると幸いです。
guest

回答3

0

tkinterの遅れて処理を実行させるafter関数を使うことでも、
繰り返しと打ち切り処理を実現することができます。

python

1#画面録画開始の関数 2def start(): 3 messagebox.showinfo('start',"画面録画開始します") 4 print("start") 5 #録画処理の関数の呼び出し 6 rec() 7 8#録画処理の関数 9rec_obj = None 10def rec(): 11 global psc #変数pstはグローバル関数であることを宣言。 12 global rec_obj #変数rec_objはグローバル関数であることを宣言。 13 print(psc) 14 psc = psc + 1 15 # afterによる自関数の繰り返し処理 16 rec_obj = root.after(1000, rec) 17 18#画面録画終了の関数 19def finish(): 20 global rec_obj #変数rec_objはグローバル関数であることを宣言。 21 messagebox.showinfo('finish',"画面録画終了します") 22 print("finish") 23 # 繰り返し処理の打ち切り 24 rec_obj and root.after_cancel(rec_obj) 25 rec_obj = None

投稿2020/10/23 07:08

yureighost

総合スコア2183

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

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

0

ベストアンサー

スレッド利用例です。

Python

1import threading # 追加 2 3# ... 4 5#画面録画開始の関数 6def start(): 7 messagebox.showinfo('start',"画面録画開始します") 8 print("start") 9 # 以下3行追加 10 th = threading.Thread(target=do_printsc, name="printsc") 11 th.daemon = True 12 th.start() 13 14# 繰り返し処理を別スレッドに 15def do_printsc(): 16 global psc #変数pstはグローバル関数であることを宣言。 17 global psc_stop #変数pst_stopはグローバル関数であることを宣言。 18 while psc >= 1 : 19 print(psc) 20 psc = psc + 1 21 time.sleep(1) 22 if psc_stop == 1: 23 break

投稿2020/10/23 06:33

lehshell

総合スコア1156

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

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

mikami_r

2020/10/23 08:01

ご教授内容で実施したい動きが出来ました。 ありがとうございました。
guest

0

コードが読めないので実行できませんが、解る範囲で

問題点:
tkinter では、イベントループというものが動作し続けていて
その中でcommand に登録された関数を呼んでいます。

mainloop() 描画や入力イベントの処理 -> start() -> mainloop()

ボタンクリックのイベント等は mainloop() で処理されますが、
start() 内にループがある為、mainloop() に処理が戻らず
finish() のクリックイベントが処理されません。


暫定的な解決策:
ループ内で root.update() を呼んでみてください。

これは、mainloopに戻らずイベントを明示的に処理する方法で、
finish が押された時に、ここでfinisheが押されたときの処理を行うことができます。
待機中のイベントが無ければ何もしません。

解決策:
イベントループがある為、基本的には他のループと共存することは難しくなります。
スレッドの利用を検討して見て下さい。

投稿2020/10/23 05:28

編集2020/10/23 16:31
teamikl

総合スコア8760

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問