« 台風並み | トップページ | 白く光っていた »

2024年5月17日 (金)

ボタンが凹んだまま

朝から晴れでいい天気。

昨日のあの強風が嘘のようだ。

 

Pythonでの小技。

「try: ~ except Exception as e:」で、エラーが発生した時、メッセージボックスでエラー内容を表示している。

これを閉じた後、tkinterのボタンが凹んだまま(沈んだまま)になる。

全体をリフレッシュすればいいのかな?と思ったけれど、一筋縄ではいかなさそう。

色々と情報を見ていたら、へー、そんなやり方があるんだ、というものに出会った。

エラーメッセージを表示した後に、「return "break"」を書けばいいとのこと。

try:
    何らかの処理
except Exception as e:
    messagebox.showerror("Error", "表示したいメッセージ。\r\n" + str(e))
    return "break"

確かに、これを書くと、ボタンの凹みがなくなった。

但し、ボタンを押したような感じにはならないけれど、ボタンが戻らないよりはマシだ。(笑)

tkinterで、エラー処理後、表示で何かおかしなところがあったら、「return "break"」を記述するといいかもしれない。

ちょっと検証してみたら、bindに何を指定するかで違うよう。

「<Button-1>」だと、上記の通りで、「<ButtonRelease-1>」だと、「return "break"」はなくても、ボタンは元に戻る。

リリースした時、つまり、ボタンが元に戻った時だから、当然と言えば当然なのだろう。

前者を使う場合は、「return "break"」を記述し、後者を使う場合は、記述しなくていいようだ。

挙動が違うのは面白いね。

 

後日、Copilotに聞いてみたら、「コールバック関数の最後に return "break" を追加することで、イベントの伝播を停止し、ボタンが凹んだままになるのを防ぐこともできます」という回答を得た。

あともう一つ、afterメソッドを使うやり方も教えてくれた。

#ボタンの定義略
button.config(relief=tk.RAISED)

(色々と略)

try:
    何らかの処理
except Exception as e:
    er = e
    root.after(1, lambda: messagebox.showerror("Error", "表示したいメッセージ。\r\n" + str(er)))

「button」は、皆さんが定義しているボタン名にしてね。

「er = e」にしているのは、「str(e)」ではうまくいかなかったから。
何かやり方を間違えているのだろうか?と思って、Copilotに聞いてみると、「str(e)でeが取得できないという問題についてですが、eはexceptブロック内でのみ有効なローカル変数です。lambda関数内でeを直接参照しようとすると、そのスコープ外で参照しようとしているため、エラーが発生します」とのことで、エラーになったのは当然で、このやり方で問題ないようだ。

Copilot、賢いね!(笑)

|

« 台風並み | トップページ | 白く光っていた »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




« 台風並み | トップページ | 白く光っていた »