Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter按钮不存在´;不要改变它´;按了它之后,她松了一口气_Python_Button_Tkinter - Fatal编程技术网

Python Tkinter按钮不存在´;不要改变它´;按了它之后,她松了一口气

Python Tkinter按钮不存在´;不要改变它´;按了它之后,她松了一口气,python,button,tkinter,Python,Button,Tkinter,为什么我的tkinter按钮在按下后仍保持“凹陷”状态 import tkinter from tkinter import messagebox as msgbox class GUI(object): def __init__(self): self.root = tkinter.Tk() self.root.geometry("200x200") self.root.title("Test") self.tes

为什么我的tkinter按钮在按下后仍保持“凹陷”状态

import tkinter
from tkinter import messagebox as msgbox 

class GUI(object):
    def __init__(self):
        self.root = tkinter.Tk()
        self.root.geometry("200x200")
        self.root.title("Test")


        self.testButton = tkinter.Button(self.root, text="Click Me!")
        self.testButton.bind("<Button-1>", self.click)
        self.testButton.bind("<ButtonRelease-1>", self.release)
        self.testButton.pack()

    def release(self, event):
        event.widget.config(relief=tkinter.RAISED)

    def click(self, event):
        result =  msgbox.askokcancel("Continue?", "Do you want to continue?")
        if result:
            print("Okay")
        else:
            print("Well then . . .")
        print(event.widget.cget("relief"))
        print()

if __name__ == "__main__":
    test = GUI()
    test.root.mainloop()
导入tkinter
从tkinter将messagebox作为msgbox导入
类GUI(对象):
定义初始化(自):
self.root=tkinter.Tk()
self.root.geometry(“200x200”)
self.root.title(“测试”)
self.testButton=tkinter.Button(self.root,text=“单击我!”)
self.testButton.bind(“,self.click)
self.testButton.bind(“,self.release)
self.testButton.pack()
def释放(自身、事件):
event.widget.config(relief=tkinter.RAISED)
def单击(自身,事件):
结果=msgbox.askokcancel(“继续?”,“是否继续?”)
如果结果为:
打印(“好”)
其他:
打印(“那么……”)
打印(event.widget.cget(“relief”))
打印()
如果名称=“\uuuuu main\uuuuuuuu”:
test=GUI()
test.root.mainloop()
控制台显示浮雕是“凸起”的,但在GUI上它停留在“凹陷”浮雕中,为什么?

您的回调正在打印“raised”,因为您的代码是在默认按钮绑定之前运行的,因此按钮释放实际上是在调用函数时触发的

我很确定这就是导致按钮下沉的原因:

  • 单击按钮,将显示一个对话框。此时按钮被提升,因为tkinter的默认绑定还没有机会运行1,而正是默认绑定导致按钮出现凹陷
  • 此时会出现一个对话框,从主窗口窃取焦点
  • 单击并释放按钮以单击对话框。由于对话框窃取了焦点,因此第二次释放事件不会传递给按钮
  • 此时,原始单击的处理将继续进行,控制将转到按钮单击的默认tkinter绑定
  • 默认行为会导致按钮凹陷
  • 此时,您的鼠标按钮未按下,因此自然无法释放按钮。由于无法释放按钮,因此窗口永远不会看到释放事件
  • 因为按钮从未看到按钮释放事件,所以按钮保持凹陷状态

  • 1有关tkinter如何处理事件的描述,请参阅以下答案:。答案集中在键盘事件上,但同样的机制也适用于鼠标按钮

    编辑您的帖子并放置文件,不要放置图像来显示您的代码。我无法测试它,因为我不想重新键入您的代码,但我想如果您使用
    命令
    参数而不是
    bind
    ,它将按照您的需要工作:
    tkinter.Button(root,text=“click me”,command=self.click)
    。您还需要从click方法的参数中删除“event”。下次以文本形式发布代码。@Jonathan这可以解决问题,但有办法保持绑定吗?是:绑定到“”。下次在代码中包含所有需要的导入。你的例子应该是可运行的。@Jonathan你测试过吗?它仍然留在凹陷的浮雕中。我编辑了这个问题,谢谢:)谢谢,这很有帮助:)