+-

我在 Windows 7上使用 Python 3.3.
我有一个tkinter应用程序,其中一个按钮触发了tkinter.simpledialog.Dialog.
这样(这是一个完整的,可运行的示例):
我有一个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保持按下状态 - 乐贴网