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

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

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

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

Python

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

Q&A

解決済

1回答

4660閲覧

tkinterのbuttonコマンドで、引数を使用しつつ、実行内容を保持する方法

messon

総合スコア12

Tkinter

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

Python

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

0グッド

0クリップ

投稿2020/05/28 09:24

tkinterを用いて、ボタンをクリックするとカメラで読み込んだ画像を保存するGUIを作ろうとしています。
画像のファイル名は「1.jpg, 2.jpg, ~~」のように連番で増やしたいと考えています。
またシステム実行時点で、保存先のフォルダに既に画像が存在する場合、番号が被らないよう、続きの番号から保存していきたいと考えています。
現在、この仕組みを実現できずに困っております。

下記は現状のソースコードです。

Python3

1#フォルダ内の画像の番号(最大値)を取得する関数を実行して、撮影時の画像の番号を定義。 2picture_num = max_num_get() + 1 3 4#ボタンクリック時に実行される関数を定義。 5def button_takepic_clicked(): 6 print("take a picture. Name:" + str(picture_num) + ".jpg" ) 7 cv2.imwrite(takepic_path + str(picture_num) + ".jpg", frame_cv2) 8 picture_num += 1 9 return 10#ボタン作成。 11button_takepic = tk.Button(root, text="撮影", command=button_takepic_clicked)

実行すると下記のエラーが発生します。ボタンクリック時の処理の中で、関数外で定義した変数 picure_num に代入をしているので、UnboundLocalErrorとなります。

~~(略)~~ print("take a picture. Name:" + str(picture_num) + ".jpg" ) UnboundLocalError: local variable 'picture_num' referenced before assignment

対策として、下記のような変更をして、picture_numを引数として読み込んでみましたが、するとボタン実行毎にpicture_numが初期化されてしまいます。

Python3

1#ボタン作成。 2button_takepic = tk.Button(root, text="撮影", command=lambda:button_takepic_clicked(picture_num))

コマンド実行時に引数を読み込みつつ、内部の処理が初期化されない方法はあるのでしょうか。
何卒よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。クリック時の実行関数の内外どちらもで、picture_numをグローバル変数に定義しました。
(中と外のどちらかでだけだとエラーになります。)

Python3

1global picture_num 2#撮影関数 3def button_takepic_clicked(): 4 global picture_num 5 print("take a picture. Name:" + str(picture_num) + ".jpg" ) 6 cv2.imwrite(takepic_path + str(picture_num) + ".jpg", frame_cv2) 7 picture_num += 1 8 return

投稿2020/05/28 09:34

編集2020/05/28 09:58
messon

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問