tkinter.simpledialog.Dialog离开了启动tkinter.Button郁闷

时间:2013-10-05 13:37:29

标签: python button dialog tkinter simpledialog

我在Windows 7上使用Python 3.3。 我有一个tkinter应用,其中一个Button会触发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()

行为:

  • 如果你专注于“打开对话框” Button并输入 RETURN ,一切都很好用
  • 如果您鼠标点击Button,对话框就会显示正常,
  • 对话框关闭时,“打开对话框” Button显示在 郁闷(tkinter.SUNKEN,如果我没弄错的话?)状态。
  • (有趣的是,对话框打开时,Button就是 正常显示。 只有在对话框关闭后,才会启动抑制的外观。)
  • 我试图通过简单地调用来修复问题 button.config(relief=tkinter.RAISED),但事实并非如此 在这种情况下似乎什么都做了。

(实际上,我的完整应用程序开始显示按钮按下了  单击之后,不仅在对话框再次关闭后。  我觉得这更合乎逻辑:  simpledialog本地事件循环会抓取所有事件,因为simpledialog  是模态的;这可能包括Button上的<ButtonRelease-1>鼠标事件?)

问题:

  1. 为什么会这样?
  2. 为什么我的完整申请中的行为会有所不同?
  3. 如何避免或修复两者?

2 个答案:

答案 0 :(得分:3)

这种情况正在发生,因为你正在部分覆盖做正确事情的默认绑定。

如果您希望按钮在按钮激活上执行功能,正确的方法是在按钮上添加command选项。我使用“激活”代替“按”的原因是 - 如您的代码所示 - 在tk中激活按钮的方法不止一种:按下按钮,按下按键,加速键按下等等。

您编写的代码不会替换相当大的默认绑定集。 iCodez的答案确实正确地解决了最明显的缺陷,但是让默认绑定成立并使用command=将适用于您未测试的情况(例如仅键盘操作)。

答案 1 :(得分:0)

对于第三个问题,我有一个简单的解决方案。实际上,你自己在帖子中得到了答案。改变这一行:

self.button.bind("<Button-1>", open_dialog_op)

到此:

self.button.bind("<ButtonRelease-1>", open_dialog_op)

现在,open_dialog_op绑定了鼠标点击的释放。意思是,simpledialog只会在按钮重新启动时打开(这应该是它的行为)。

但是,我也想提出一个建议。为什么不使用tkinter.messagebox.askokcancel呢?它与Windows的系统提示相同。见下文:

tkinter.simpledialog.Dialog对话框:

enter image description here

tkinter.messagebox.askokcancel对话框:

enter image description here