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

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

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

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

Tkinter

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

Q&A

解決済

2回答

3109閲覧

複数自動生成されたボタン背景色を一括で変更する(デフォルト色に戻す)仕組みを作りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2021/04/09 14:46

前提・実現したいこと

Python 3
実行ボタンを押す事で、複数自動生成された他のボタン背景色を一括で変更する(デフォルト色に戻す)仕組みを作りたい。

もしくは操作GUIをリセットする方法が知りたい。もしくは全てのボタンを一度削除して描画する方法が知りたい。手段がどうであれ、目的変化したボタンの背景色を戻す事。

■質問内容■
<作ったもの>
・配列を元にボタンを複数自動生成
・自動生成されたボタンを押すとそのボタンの色が変わる
・実行ボタンを押す事で、押されたボタンのテキストを配列として出力する

<質問>
何度も同じ処理を繰り返したいので、実行ボタンを押下した時に、背景色が変わったボタンの背景色をデフォルトに戻す機能を追加する方法が知りたいです。

発生している問題・エラーメッセージ

・背景色を別のボタンから変更する方法は分かりましたが、自動生成された一番最後のボタンにしか適応されません。

該当のソースコード

Python3

1 2import tkinter as tk 3import pyperclip 4 5root = tk.Tk() 6root.geometry("200x800+1700+400") 7root.title('タグ取得') 8 9#配列 10list = ["AAA", "BBB", "CCC", "DDD"] 11mlen = len(list) #要素数 12result = [] #最終出力用の配列箱 13 14#選択した配列の結果を出力する実行ボタン 15def getlist(event): 16 # event.widget.config(bg="pink") 17 print(result) 18 joined_result = ', '.join(result) #配列をカンマで区切りつつ連結 19 pyperclip.copy(joined_result) #クリップボードにコピー 20 result.clear() #配列を空にする 21 btn.config(bg='gray') ←●ここが質問ポイント。 22 23#ボタンリストを表示させる 24def button_func(event): 25 event.widget.config(bg="red") 26 print(event.widget.cget("text") + "を選択しました") 27 result.append(event.widget.cget("text")) 28 29#結果を取得するボタンを配置 30btn_get = tk.Button(root, text = "■作成■", font=("", 30) ) 31btn_get.pack() 32 33# ボタンクリック時のイベント設定 34btn_get.bind("<ButtonPress>", getlist) 35print(result) 36 37#一覧のボタンを配置 38for i in range(mlen) : 39 btn_name = list[i] # ボタンの名前(テキスト)を設定 40 41 # ボタンのインスタンス作成 42 btn = tk.Button(root, text = btn_name, font=("", 20)) 43 44 btn.pack() # ボタンを配置 45 46 # ボタンクリック時のイベント設定 47 btn.bind("<ButtonPress>", button_func) 48 49root.mainloop()

試したこと

実行ボタンを押した時に、
・配列ボタンの背景色を変える
・配列ボタンをすべて削除する
をやろうとしましたが、一番最後に作成されたボタンにしか適応できませんでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ごコードに arrr_Volume.append(btn) とデフォルトボタン追加して、あなたの機能を実現しました。
配列を元にボタンを複数自動生成のところにボタンがLISTに入れて、デフォルトボタンを押すとボタンの色を確認して、色が変わったら元の色を戻します。

python

1import tkinter as tk 2 3root = tk.Tk() 4root.geometry("200x800+1700+400") 5root.title('タグ取得') 6 7#配列 8list = ["AAA", "BBB", "CCC", "DDD"] 9mlen = len(list) #要素数 10result = [] #最終出力用の配列箱 11arrr_Volume = [] 12 13 14#選択した配列の結果を出力する実行ボタン 15def getlist(event): 16 # event.widget.config(bg="pink") 17 print(result) 18 joined_result = ', '.join(result) #配列をカンマで区切りつつ連結 19 pyperclip.copy(joined_result) #クリップボードにコピー 20 result.clear() #配列を空にする 21 btn.config(bg='gray') 22 23def color_reset(event): 24 # event.widget.config(bg="pink") 25 26 for x in arrr_Volume: 27 color = x.cget("bg") 28 print(color) 29 30 if color == "red": 31 x.config(bg="SystemButtonFace") 32 33#ボタンリストを表示させる 34def button_func(event): 35 event.widget.config(bg="red") 36 print(event.widget.cget("text") + "を選択しました") 37 result.append(event.widget.cget("text")) 38 39def button_func_release(event): 40 event.widget.config(bg="grey") 41 print(event.widget.cget("text") + "を選択しました") 42 result.append(event.widget.cget("text")) 43 44#結果を取得するボタンを配置 45btn_get = tk.Button(root, text = "■作成■", font=("", 30) ) 46btn_get.pack() 47default = tk.Button(root, text = "■Default■", font=("", 30) ) 48default.pack() 49 50# ボタンクリック時のイベント設定 51btn_get.bind("<ButtonPress>", getlist) 52default.bind("<ButtonPress>", color_reset) 53print(result) 54 55#一覧のボタンを配置 56for i in range(mlen) : 57 btn_name = list[i] # ボタンの名前(テキスト)を設定 58 59 # ボタンのインスタンス作成 60 btn = tk.Button(root, text = btn_name, font=("", 20)) 61 btn.pack() # ボタンを配置 62 63 # ボタンクリック時のイベント設定 64 btn.bind("<ButtonPress>", button_func) 65 arrr_Volume.append(btn) 66 67root.mainloop()

投稿2021/04/09 20:35

編集2021/04/09 20:36
FredericChang

総合スコア54

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

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

0

ベストアンサー

「#一覧のボタンを配置」のところで作成したbtnを、たとえばbtn_listなどの配列に保存しておく。

python

1btn_list = [] 2for i in range(mlen) : 3 btn_name = list[i] # ボタンの名前(テキスト)を設定 4 5 # ボタンのインスタンス作成 6 btn = tk.Button(root, text = btn_name, font=("", 20)) 7 btn_list.append(btn)

こうしておけば、「btn.config(bg='gray') ←●ここが質問ポイント。」のところは、

python

1for btn in btn_list: 2 btn.config(bg='gray')

こんな感じですべてのボタンの色を変更できます。

投稿2021/04/09 15:11

編集2021/04/09 15:14
TakaiY

総合スコア13790

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

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

退会済みユーザー

退会済みユーザー

2021/04/10 03:39

やりたかったことがシンプルに実装できました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問