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

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

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

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

Python

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

Q&A

解決済

2回答

11176閲覧

Tkinter Buttonのbackgroundの色を動的に変更する方法

redp

総合スコア49

Python 3.x

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

Python

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

0グッド

2クリップ

投稿2018/04/13 12:22

前提・実現したいこと

TkinterでUIを作成しているのですが、ボタンを押した際にボタンの背景色を変更したいと考えています。
以下のようなforで回してボタンを10x10個敷き詰めたUIです。
Tkinterについて、まだわかっていないことだらけなのでどうかご教示願います。

該当のソースコード

Fieldクラスは10x10のlistで値は0で初期化されています。

Python

1import tkinter as tk 2from Field import Field 3 4 5class Gui(tk.Frame): 6 7 def __init__(self, master=None): 8 super(Gui, self).__init__(master) 9 self.field = Field() 10 self.create_widget() 11 12 def create_widget(self): 13 for y in range(self.field.height): 14 for x in range(self.field.width): 15 tk.Button(self, text=str(self.field.field[y][x]), font=('Helvetica', 20)).grid(column=x, row=y, sticky=('N', 'S', 'E', 'W')) 16 self.grid(column=0, row=0, sticky=('N', 'S', 'E', 'W')) 17 18 for i in range(10): 19 self.columnconfigure(i, weight=1) 20 21 for i in range(10): 22 self.rowconfigure(i, weight=1) 23 24 self.master.columnconfigure(0, weight=1) 25 self.master.rowconfigure(0, weight=1) 26 27 28def main(): 29 root = tk.Tk() 30 root.geometry('800x800') 31 root.title('Test') 32 Gui(root) 33 root.mainloop() 34 35 36if __name__ == '__main__': 37 main() 38

試したこと

listで管理しようと思いましたが、Noneが追加されるためできなかった。

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

Ubuntu16.04
python 3.6

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

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

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

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

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

guest

回答2

0

ここをリストで管理しようとしたらNoneが返ったということですか。

python

1tk.Button(self, text=str(self.field.field[y][x]), font=('Helvetica', 20)).grid(column=x, row=y, sticky=('N', 'S', 'E', 'W'))

たぶんだけど、gridの返り値がNoneなんじゃないですかね。

python

1button = tk.Button(self, text=str(self.field.field[y][x]), font=('Helvetica', 20)) 2button.grid(column=x, row=y, sticky=('N', 'S', 'E', 'W')) 3manage_lst.append(button)

これでリストで管理はできるようになると思います。そこからどうやるのかは私もよくわからないので、頑張ってください!

追記

さすがに無責任すぎる回答だ・・・と思い直して適当にググってたらこんな記事見つけました。

python tkinter クリックされたウィジェットのテキストや属性を取得する - memopy

適切なコールバック関数を書いてbindすれば良いみたいです。関数の側でどのボタンから来たのかも判るので、リスト管理する必要も大してないのかも。

投稿2018/04/13 12:34

編集2018/04/13 12:42
hayataka2049

総合スコア30933

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

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

redp

2018/04/14 13:21

リンク先のサイト、大変参考になりました。 回答ありがとうございました。
guest

0

ベストアンサー

Field部分は適当な文字列に変えています。

python

1import tkinter as tk 2 3 4class Gui(tk.Frame): 5 6 def __init__(self, master=None): 7 super(Gui, self).__init__(master) 8 self.create_widget() 9 10 def create_widget(self): 11 for y in range(10): 12 for x in range(10): 13 # Buttonオブジェクトを、一度変数に入れておきます。 14 button = tk.Button( 15 self, text='{0}{1}'.format(y, x), font=('Helvetica', 20) 16 ) 17 # 配置します。 18 button.grid(column=x, row=y, sticky=('N', 'S', 'E', 'W')) 19 # それぞれのボタンを押したら、change_colorメソッドが呼ばれます。 20 button.bind('<Button-1>', self.change_color) 21 22 self.grid(column=0, row=0, sticky=('N', 'S', 'E', 'W')) 23 24 for i in range(10): 25 self.columnconfigure(i, weight=1) 26 27 for i in range(10): 28 self.rowconfigure(i, weight=1) 29 30 self.master.columnconfigure(0, weight=1) 31 self.master.rowconfigure(0, weight=1) 32 33 def change_color(self, event): 34 # 押されたボタン等のウィジェットには、event.widgetでアクセスできます。k 35 # bgの部分は、text等にもできます。 36 event.widget['bg'] = 'white' 37 38 39def main(): 40 root = tk.Tk() 41 root.geometry('800x800') 42 root.title('Test') 43 Gui(root) 44 root.mainloop() 45 46 47if __name__ == '__main__': 48 main() 49

投稿2018/04/13 13:27

編集2018/04/13 13:33
toritoritorina

総合スコア972

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

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

redp

2018/04/14 13:25

わかりやすくコメントまで書いて頂き、非常に参考になります。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問