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

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

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

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

Tkinter

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

Q&A

解決済

2回答

1142閲覧

トグルボタン実装がうまくいかない

evilscope

総合スコア16

Python 3.x

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

Tkinter

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

0グッド

0クリップ

投稿2022/12/09 04:08

前提

pythonのtkinterでトグルボタンの実装をしようとしています。

実現したいこと

クリックごとにボタンの見た目を変化させる

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

2回連続で同じボタンを押さないと見た目を変化させることができない

該当のソースコード

Python

1import tkinter as tk 2 3baseGround = tk.Tk() 4 5def type_select(event): 6 relief = event.widget.cget("relief") 7 print(relief) 8 if relief == "raised": 9 event.widget.config(relief="sunken") 10 else: 11 event.widget.config(relief="raised") 12 13# 選択タイプボタン配置 14k = 0 15for i in range(5): 16 for j in range(4): 17 if k != 18: 18 # ボタン作成 19 button = tk.Button( 20 baseGround, 21 text=k, 22 relief="raised", 23 width=10 24 ) 25 # ボタン配置 26 button.grid(row=i, column=j) 27 # クリックイベント作成 28 button.bind("<Button-1>", type_select) 29 k = k + 1 30 31 32baseGround.mainloop() 33

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

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

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

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

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

guest

回答2

0

提示していただいた1.の方法で想定していた動作が行えるようになりました。

python

1import tkinter as tk 2 3baseGround = tk.Tk() 4 5def type_select(event): 6 relief = event.widget.cget("relief") 7 print(relief) 8 if relief == "raised": 9 event.widget.config(relief="sunken") 10 print("sunken") 11 return "break" 12 else: 13 event.widget.config(relief="raised") 14 print("raised") 15 return "break" 16 17# 選択タイプボタン配置 18k = 0 19type_images = [] 20for i in range(5): 21 for j in range(4): 22 if k != 18: 23 # ボタン作成 24 button = tk.Button( 25 baseGround, 26 text=k, 27 relief="raised", 28 width=10 29 ) 30 # ボタン配置 31 button.grid(row=i, column=j) 32 # クリックイベント作成 33 button.bind("<ButtonPress-1>", type_select) 34 k = k + 1 35 36 37baseGround.mainloop()

としました。
ありがとうございます。

投稿2022/12/09 23:51

evilscope

総合スコア16

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

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

0

ベストアンサー

マウスクリックのイベントには ButtonPress と ButtonRelase があり
デフォルトの挙動で relief を変更していて、
ボタンを押したときに sunken に変更、離したときに元に戻すという振る舞いをします。

tkinter では、イベントハンドラ内で return "break" と文字列を返すことで
イベント伝搬をキャンセルし、デフォルトの挙動を抑制できます。

解決策

  1. <Button-1><ButtonPress-1> に変更し

 type_select 関数の末尾で return "break"
2. button.bind("<ButtonRelease-1", lambda: "break")

注意点
ButtonRelease で "break" を返すと、
Button の command に設定した関数は呼ばれなくなります。
(デフォルトの挙動をキャンセルする為)

他の解決策
<Button-1> の bind ではなく、Button の command 内で relief を変更する。
デフォルトの挙動を行った後の relief 変更なので、デフォルト挙動の影響を受けない。
(※ command では event は引数に渡らないので、button のインスタンスを functools.partial 等で渡します)

python

1# 事前に import 2from functools import partial 3from types import SimpleNamespace 4 5... 6 7 # event の代わりに event.widget 部分に button を格納した名前空間を渡す 8 button.config(command=partial(type_select, SimpleNamespace(widget=button))) 9

投稿2022/12/09 19:52

編集2022/12/09 21:07
teamikl

総合スコア8664

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問