+-
python-tkinter.simpledialog.Dialog使启动的tkinter.Button保持按下状态
我在 Windows 7上使用 Python 3.3.
我有一个tkinter应用程序,其中一个按钮触发了tkinter.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()

行为:

>如果您将焦点放在“打开对话框”按钮上,然后键入RETURN,则一切正常
>如果您用鼠标单击“按钮”,则对话框显示一切正常,但是
>当对话框关闭时,“打开对话框”按钮显示在
它的沮丧状态(tkinter.SUNKEN,如果我没记错的话?).
>(有趣的是,当对话框打开时,按钮为
正常显示.
对话框关闭后,才会开始显示沮丧的表情.)
>我试图通过简单地致电来解决问题
button.config(relief = tkinter.RAISED),但这不是
在这种情况下似乎什么也没做.

(实际上,我的完整应用程序开始将按钮显示为按下状态
 单击后,不仅对话框再次关闭.
 我发现这更合乎逻辑:
 simpledialog本地事件循环会捕获所有事件,因为simpledialog
 是情态的这可能包括< ButtonRelease-1>按钮上的鼠标事件?)

问题:

>为什么会这样?
>为什么我的完整应用程序中的行为会有所不同?
>如何避免或修复两者?

最佳答案
之所以会这样,是因为您部分覆盖了执行Right Thing的默认绑定.

如果您希望按钮在按钮激活时执行功能,则执行此操作的正确方法是向按钮添加命令选项.正如您的代码所示,我使用“激活”而不是“按下”的原因是-tk中激活按钮的方式不只一种:按钮按下,返回按下,加速键按下等.

您编写的代码不会替换大量的默认绑定. iCodez的答案确实可以正确修复最明显的缺陷,但是保留默认绑定并使用command =可以在您尚未测试的情况下工作(例如,仅键盘操作).

点击查看更多相关文章

转载注明原文:python-tkinter.simpledialog.Dialog使启动的tkinter.Button保持按下状态 - 乐贴网