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)
在此代码中,程序会更改任何对象的填充颜色.我希望它只为矩形改变它.
谢谢您的帮助.
以下是此问题的三种常见解决方案:
您可以向画布询问对象的类型:
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)