【问题标题】:deselect tkinter canvas buttons取消选择 tkinter 画布按钮
【发布时间】:2020-07-02 07:14:13
【问题描述】:

我有一个由 tkinter 画布按钮创建的按钮,我绑定它,这样当我按下它时,它会给我一个“下沉”效果和一个值。但是我想给它另一种效果,这样当我再次按下它时,它会恢复正常,即“平坦”。

def press(canvas1, y):
    canvas1.configure(relief="sunken")
    print(y)

canvas = tk.Canvas(root, width=50, height=20, borderwidth=1)
buttonBG1 = canvas.create_rectangle(0, 0, 50, 20, outline="", activefill="#F1F1F1")
buttonTXT1 = canvas.create_text((25, 10), text="button", font=("Calibri", 8))
canvas.tag_bind(buttonBG1, "<ButtonPress-1>", lambda x: press(canvas, 100))
canvas.tag_bind(buttonTXT1, "<ButtonPress-1>", lambda x: press(canvas, 100))

这是他们的一种方式,当我第二次按下按钮时,它就像释放的效果,但我想按下来释放。

【问题讨论】:

    标签: python python-3.x tkinter canvas tkinter-canvas


    【解决方案1】:

    您可以切换按钮方面的值;在这里,我们使用一个跟踪状态的闭包来做到这一点。

    import tkinter as tk
    
    
    def press(canvas1, y, toggle=('sunken', 'flat'), _turn=[0]):
        canvas1.configure(relief=toggle[_turn[0]])
        _turn[0] = (_turn[0] + 1) % 2
        print(y)
    
    
    if __name__ == '__main__':
    
    
        root = tk.Tk()
        canvas = tk.Canvas(root, width=50, height=20, borderwidth=1)
        canvas.pack(expand=True, fill=tk.BOTH)
        buttonBG1 = canvas.create_rectangle(0, 0, 50, 20, outline="", activefill="#F1F1F1")
        buttonTXT1 = canvas.create_text((25, 10), text="button", font=("Calibri", 8))
        canvas.tag_bind(buttonBG1, "<ButtonPress-1>", lambda x: press(canvas, 100))
        canvas.tag_bind(buttonTXT1, "<ButtonPress-1>", lambda x: press(canvas, 100))
    
        root.mainloop()
    

    【讨论】:

    • 谢谢,这正是我想要的
    • 虽然这段代码有问题。如果添加了另一个按钮,它最初会使用 toggle 的第二个参数,直到我再次按下它。
    • 对于更复杂的设计,您可以使用更复杂的切换机制来存储按钮的状态。将按钮封装在一个类中是一种方法。
    • 是的,这是其中一种方法。再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 2017-10-05
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 1970-01-01
    • 2011-07-17
    • 2020-12-23
    相关资源
    最近更新 更多