我在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>
鼠标事件?)
问题:
答案 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
对话框:
tkinter.messagebox.askokcancel
对话框: