为 canvas 按钮创建对 Tkinter 有影响的操作

Creating actions for canvas Button with the effect on Tkinter

我正在按照 and How do you create a Button on a tkinter Canvas? 作为在 Tkinter Canvas 上为 Button 创建一些操作的指南?这些操作有效,但 Button 的效果被冻结了。

代码:

import tkinter as tk
import tkinter.font as tkfont
main = tk.Tk()
font = tkfont.nametofont("TkDefaultFont")
label = "Click Me"
height = font.measure(label) + 4
width = font.metrics()['linespace'] + 4
canvas = tk.Canvas(main, height=height, width=width, background="SystemButtonFace", borderwidth=2, relief="raised")
canvas.create_text((4, 4), angle="90", anchor="ne", text=label, fill="SystemButtonText", font=font)

canvas.bind("<ButtonPress-1>", lambda ev: ev.widget.configure(relief="sunken"))
canvas.bind("<ButtonRelease-1>", lambda ev: ev.widget.configure(relief="raised"))
canvas.bind("<ButtonPress-1>", lambda ev: submit())

def submit():
    print("1")

canvas.place(x=5, y=height + 10)
main.mainloop()

如果我删除 canvas.bind("<ButtonPress-1>", lambda ev: submit()),则 Button 的效果有效,但还有 Submit 操作。

否则,如果像上面那样保留包含行 canvas.bind("<ButtonPress-1>", lambda ev: submit()) 的代码,那么 Button 的效果将被冻结,但 Submit 动作有效。

我正在寻找一种方法来使 ButtonSubmit 操作的效果一起工作。请帮我。谢谢。

您需要在 <ButtonPress-1> 事件的第二个绑定上设置 add=True,这样之前的绑定就不会被覆盖:

canvas.bind("<ButtonPress-1>", lambda ev: ev.widget.configure(relief="sunken"))
canvas.bind("<ButtonRelease-1>", lambda ev: ev.widget.configure(relief="raised"))
canvas.bind("<ButtonPress-1>", lambda ev: submit(), add=True) # added add=True