マウスポインタに依存せず、押せばすぐ変わるという風にしたいです。
当方では再現せず、押すとすぐに背景が変わりました。
(Windows 10, CPython 3.7.0, Tcl/Tk 8.6)
環境(OSの違いやTcl/Tkのバージョンとか)による差なのか質問者さんが提示しておられない他の部分のコードに影響を受けていたりするのか・・・そのあたりは自分には何とも言えません。
ボタン3をdisableにし指定しているのですが、ボタンを押せてしまいます。
本来はdisable
ではなくdisabled
だと思います。それはともかく、tkinterのウィジェットはdisableにしてもbindしたイベントの発火は抑止されないようです。しかしButtonインスタンスを生成する際のcommand引数に指定したハンドラーは抑止されるみたいです。
オンラインヘルプでButton.invokeのドキュメントを見ると
python
1>>> import tkinter as tk
2>>> help(tk.Button.invoke)
3Help on function invoke in module tkinter:
4
5invoke(self)
6 Invoke the command associated with the button.
7
8 The return value is the return value from the command,
9 or an empty string if there is no command associated with
10 the button. This command is ignored if the button's state
11 is disabled.
となってました。しかしButton.bindのドキュメントを見ても非活性の場合にイベントが発火しないといった説明は見当たりません。
対処としては
(1) command引数を用いる
Button3 = tk.Button(..., command=callback3)
のようにしてボタンを生成しbindを使わないようにすればdisable状態でハンドラーが起動しなくなります。ただ、command引数に指定したハンドラーにはイベントが渡ってこないのでボタンごとに異なるハンドラーを指定する必要がありそうです。つまりcallback5でやっておられるように「引数にわたってきたイベントのwidget属性を見ればどのボタンが押されたかがわかる」というふうにはできないので。
(2) bindに指定したハンドラーの中でdisable属性をチェックする
python
1def callback3(event):
2 if event.widget['state'] == 'disabled':
3 return
4 ...
こういう判定を一々やりたくはないので、もうちょっと工夫するならデコレーターを定義するなんて方法もアリかも知れません。
stateをチェックしてdisabledでない場合のみ関数を実行するといったデコレーターを定義しておきハンドラーを定義する際にそのデコレーターを指定するわけです。いくつものハンドラー関数のそれぞれに一々stateチェックを入れずに済むのでまぁまぁ我慢できるのではないでしょうか?
python
1def only_enabled(f):
2 def handle(event):
3 if event.widget['state'] != 'disabled':
4 f(event)
5 return handle
6
7@only_enabled
8def callback3(event):
9 ...
10
11...
12Button3.bind('<Button-1>', callback3)
13...
訂正・追記:
ご質問やコメント欄の内容を拝見していて
ボタンを押すと押されたままの状態になるので、return "break"
を入れている
どうもこれがピンとこなかったのですが、環境の違いじゃないかと思います。
自分はWindows 10でPython3.7にて動かしてみてたのですがそういう動きにはなりません。そこでふと環境の違いかなと思いUbuntuでやってみたところマウスhoverによって背景色が変化するといった動作は確認できました。WindowsやLinuxやMacにはそれぞれ仕様の異なるGUIサブシステムが入っているのはご存じかも知れません。例えばLinuxだとさらに複数のウィンドウマネージャーが存在しGnomeとMotifではボタンなどの振る舞いや外観がかなり違います。
環境固有の振る舞いは同じ環境でないと再現できないと思います。それゆえご自分の環境(OSやウィンドウマネージャーなど)を追記しましょう。もしあなたがMacintoshをお使いなら自分は持ってないので再現のやりようがないです。
Windows10ではご質問にあるような
・return "break"しないとボタンが押されたままになる
・マウスhoverしないと設定した背景色が反映されない
といった現象は起きないのです。
なお、本サイトではコメント欄にコード(特にインデントが重要な意味を持つPythonのコード)を書くのは避けるべきです。元の質問に不足内容があった場合は質問本文を編集してください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/21 22:10
2019/04/21 22:28
2019/04/21 23:46
2019/04/22 12:56