3

Windows 7 で Python 3.3 を使用していtkinterます。このように (これは完全で実行可能な例です):Buttontkinter.simpledialog.Dialog

import tkinter
import tkinter.simpledialog

class Mainframe(tkinter.Frame):
    def __init__(self, parent):
        super(Mainframe, self).__init__(parent)
        self.parent = parent
        self.button = tkinter.Button(self, text="Open Dialog")
        open_dialog_op = lambda ev: self.open_dialog(ev)
        self.button.bind("<Button-1>", open_dialog_op)
        self.button.bind("<Return>", open_dialog_op)
        self.button.pack(side=tkinter.LEFT)

    def open_dialog(self, event):
        dialog = tkinter.simpledialog.Dialog(self.parent, "My Dialog")
        self.button.config(relief=tkinter.RAISED)  # does not help!

root = tkinter.Tk()
Mainframe(root).pack()
root.mainloop()

動作:

  • 「ダイアログを開く」 にフォーカスしてRETURNButtonと入力すると、すべてうまく機能します
  • をマウスクリックするButtonと、ダイアログは正常に表示されますが、
  • ダイアログが閉じると、「Open Dialog」 Buttonが押された状態で表示されます (tkinter.SUNKEN間違っていなければ?)。
  • (興味深いことに、ダイアログが開いているButtonは が正常に表示されます。落ち込んだ外観は、ダイアログが閉じたときにのみ開始されます。)
  • を呼び出すだけで問題を修復しようとしました button.config(relief=tkinter.RAISED)が、この場合は何もしていないようです。

(実際には、私の完全なアプリケーションは、ダイアログが再び閉じられたときだけでなく、クリックされた直後にボタンが押された状態で表示され始めます 。これはもっと論理的だと思います。simpledialogローカル イベント ループsimpledialog はモーダルであるため、すべてのイベントを取得します。これには<ButtonRelease-1>マウスが含まれる可能性があります)。ボタンでのイベント?)

質問:

  1. なぜこれが起こるのですか?
  2. 完全なアプリケーションの動作が異なるのはなぜですか?
  3. 両方を回避または修復するにはどうすればよいですか?
4

2 に答える 2

3

これは、正しいことを行うデフォルトのバインディングを部分的にオーバーライドしているために発生しています。

ボタンのアクティブ化でボタンに機能を実行させたい場合、これを行う適切な方法はcommand、ボタンにオプションを追加することです。「押す」の代わりに「アクティブ化」を使用する理由は、コードが示すように、tk でボタンをアクティブにする方法が複数あるためです。ボタンを押す、リターンを押す、アクセラレータ キーを押すなどです。

あなたが書いたコードは、デフォルトのバインドのかなり大きなセットを置き換えません。iCodez による回答は、最も明白な欠陥を正しく修正しますが、デフォルトのバインディングcommand=をそのままにして、テストしていないケース (キーボードのみの操作など) では機能します。

于 2013-10-05T14:48:22.547 に答える