按下后,Tkinter按钮不会改变它的缓解

时间:2017-04-11 18:51:01

标签: 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.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()

控制台显示浮雕被“抬起”,但在GUI上却保持“凹陷”状态,为什么? The GUI after pressing the Button

1 个答案:

答案 0 :(得分:0)

你的回调是打印&#34;被提升&#34;因为你的代码是在默认按钮绑定之前运行的,所以实际上在调用你的函数时会增加按钮释放。

我很确定这是导致按钮保持沉没的原因:

  1. 点击按钮,会出现一个对话框。此时按钮被提升,因为tkinter的默认绑定尚未有机会运行 1 ,并且它是导致按钮显示为凹陷的默认绑定
  2. 出现一个对话框,从主窗口中窃取焦点。
  3. 单击并释放按钮以单击对话框。因为对话框已经失去了焦点,所以第二个释放事件不会传递给按钮
  4. 此时原始点击的处理继续进行,控制将转到默认的tkinter绑定以进行按钮点击。
  5. 默认行为导致按钮凹陷
  6. 此时,未按下鼠标按钮,因此您无法释放按钮。由于您无法释放按钮,因此窗口永远不会看到发布事件。
  7. 由于按钮从未看到按钮释放事件,因此按钮保持凹陷状态
  8. 1 有关tkinter如何处理事件的说明,请参阅以下答案:https://stackoverflow.com/a/11542200/7432。答案主要集中在键盘事件上,但同样的机制适用于鼠标按钮。