Python tkinter.simpledialog.Dialog使启动的tkinter.按钮保持按下状态

Python tkinter.simpledialog.Dialog使启动的tkinter.按钮保持按下状态,python,button,dialog,tkinter,simpledialog,Python,Button,Dialog,Tkinter,Simpledialog,我正在Windows7上使用Python 3.3。 我有一个tkinter应用程序,其中一个按钮会触发一个tkinter.simpledialog.Dialog。 如下所示(这是一个完整的、可运行的示例): 导入tkinter 导入tkinter.simpledialog 类大型机(tkinter.Frame): 定义初始化(自身,父级): 超级(大型机,自我)。\uuuuu初始化\uuuuuuu(父级) self.parent=parent self.button=tkinter.button

我正在Windows7上使用Python 3.3。 我有一个
tkinter
应用程序,其中一个
按钮
会触发一个
tkinter.simpledialog.Dialog
。 如下所示(这是一个完整的、可运行的示例):

导入tkinter
导入tkinter.simpledialog
类大型机(tkinter.Frame):
定义初始化(自身,父级):
超级(大型机,自我)。\uuuuu初始化\uuuuuuu(父级)
self.parent=parent
self.button=tkinter.button(self,text=“打开对话框”)
open_dialog_op=lambda ev:self.open_dialog(ev)
self.button.bind(“,打开对话框)
self.button.bind(“,打开对话框)
自助按钮包(侧面=左侧)
def open_对话框(自身、事件):
dialog=tkinter.simpledialog.dialog(self.parent,“我的对话”)
self.button.config(relief=tkinter.RAISED)#没有帮助!
root=tkinter.Tk()
大型机(根).pack()
root.mainloop()
行为:

  • 如果聚焦“打开对话框”
    按钮
    并键入RETURN,所有操作都会正常工作
  • 如果您用鼠标单击
    按钮
    ,对话框将显示正常,
  • 对话框关闭时,“打开对话框”
    按钮将显示在中
    它的状态是压抑的(
    tkinter.SUNKEN
    ,如果我没弄错的话?)
  • (有趣的是,当对话框打开时,
    按钮
    会被打开 正常显示。 只有当对话框关闭时,凹陷的外观才会开始。)
  • 我试图通过打电话来解决这个问题
    button.config(relief=tkinter.RAISED)
    ,但事实并非如此 在这种情况下似乎什么都做不了
(事实上,我的完整应用程序开始显示按下的按钮 单击后,不仅对话框再次关闭。 我觉得这更符合逻辑:
simpledialog
localevent循环捕获所有事件,因为
simpledialog
是模态;这可能包括按钮处的
鼠标事件?)

问题:

  • 为什么会发生这种情况
  • 为什么我的完整应用程序中的行为会有所不同
  • 如何避免或修复两者

  • 对于第三个问题,我有一个简单的变通解决方案。事实上,你自己也在你的帖子里找到了答案。更改此行:

    self.button.bind("<Button-1>", open_dialog_op)
    
    self.button.bind(“,打开对话框)
    
    为此:

    self.button.bind("<ButtonRelease-1>", open_dialog_op)
    
    self.button.bind(“,打开对话框)
    
    现在,
    open\u dialog\u op
    将绑定到鼠标点击的释放。这意味着,
    simpledialog
    只会在按钮返回后打开(这是它的行为应该是什么)

    不过,我也想提个建议。为什么不为此使用
    tkinter.messagebox.askokcancel
    ?这与Windows的系统提示相同。见下文:

    tkinter.simpledialog.Dialog
    Dialog:

    tkinter.messagebox.askokcancel
    对话框:


    之所以会发生这种情况,是因为您正在部分重写执行正确操作的默认绑定

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


    您编写的代码不会替换相当大的默认绑定集。iCodez的回答确实正确地修复了最明显的缺陷,但是让默认绑定保持不变并使用
    命令=
    将适用于您尚未测试的情况(例如,仅键盘操作)

    关于为什么会发生这种情况的第一个问题的答案是,按钮的提升发生在按钮释放时,而释放没有被处理,因为代码覆盖了默认行为,在对话框关闭之前阻止释放被处理。正确的解决方案不是在
    上添加绑定,而是使用内置的
    命令
    属性,该属性可以正确处理所有绑定和行为。
    self.button.bind("<ButtonRelease-1>", open_dialog_op)