gpt4 book ai didi

python - tkinter.simpledialog.Dialog 使启动 tkinter.Button 处于按下状态

转载 作者:行者123 更新时间:2023-11-28 16:40:56 31 4
gpt4 key购买 nike

我在 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 是模态的;这可能包括 <ButtonRelease-1> Button 上的鼠标事件?)

问题:

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

最佳答案

它的发生是因为您部分覆盖了做正确事情的默认绑定(bind)。

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

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

关于python - tkinter.simpledialog.Dialog 使启动 tkinter.Button 处于按下状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19198422/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com