Python/Tkinter - 点击时识别对象

Lee*_*o11 1 python canvas tkinter onclick

我正在尝试创建一个程序,根据以前的颜色,在点击时将对象颜色从白色变为黑色或从白色变为黑色.我希望程序只在对象是矩形时才改变颜色.我怎样才能做到这一点?

这是我的代码:

import tkinter as tk

root = tk.Tk()

cv = tk.Canvas(root, height=800, width=800)
cv.pack()

def onclick(event):
    item = cv.find_closest(event.x, event.y)

    current_color = cv.itemcget(item, 'fill')

    if current_color == 'black':
        cv.itemconfig(item, fill='white')

    else:
        cv.itemconfig(item, fill='black')


cv.bind('<Button-1>', onclick)

cv.create_line(50, 50, 60, 60, width=2)

cv. create_rectangle(80, 80, 100, 100)

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

在此代码中,程序会更改任何对象的填充颜色.我希望它只为矩形改变它.

谢谢您的帮助.

Bry*_*ley 5

以下是此问题的三种常见解决方案:

使用项目类型

您可以向画布询问对象的类型:

item_type = cv.type(item)
if item_type == "rectangle":
    # this item is a rectangle
else:
    # this item is NOT a rectangle
Run Code Online (Sandbox Code Playgroud)

使用标签

另一种解决方案是为每个项目提供一个或多个标签.然后,您可以查询当前项目的标签.

首先,在要点击的项目上包含一个或多个标签:

cv. create_rectangle(80, 80, 100, 100, tags=("clickable",))
Run Code Online (Sandbox Code Playgroud)

接下来,检查您感兴趣的项目上的标记,并检查您的标记是否在该项目的标记集中:

tags = cv.itemcget(item, "tags")
if "clickable" in tags:
    # this item has the "clickable" tag
else:
    # this item does NOT have the "clickable" tag
Run Code Online (Sandbox Code Playgroud)

在标签上创建绑定

第三种选择是将绑定附加到标记而不是整个画布.执行此操作时,只有在单击具有给定标记的项目时才会调用您的函数,从而无需进行任何类型的运行时检查:

cv.tag_bind("clickable", "<1>", onclick)
Run Code Online (Sandbox Code Playgroud)