Python tkinter.simpledialog.Dialog使启动的tkinter.按钮保持按下状态
我正在Windows7上使用Python 3.3。 我有一个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
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)