我正在使用一个简单的函数,该函数在画布上创建矩形(具有用户指定的大小)。
def create_some_rectangle(self):
self.canvas.create_rectangle(master, x0, y0, x1, y1, fill='somecolor')
# user specify x0 y0 x1 y1
但是我想添加一些内容以供将来寻址(通过单击鼠标突出显示特定的小部件)。如果将有1个矩形,这很简单,但是用户创建了许多矩形,因此我需要一些特殊的东西来分别突出显示每个小部件。
我怎么能意识到这一点?这个\有什么有用的想法吗?
答案 0 :(得分:1)
无论何时在画布上创建一个对象,该函数都会返回一个唯一的整数标识符。您可以使用此ID引用该对象。
您还可以为对象提供一个唯一标记,该标记可以是您想要的任何字符串,但只能包含数字字符串(因为它将与id冲突)。
在您的方案中,当用户单击一个对象时,您可以保存他们单击的对象的标识符。然后,您可以稍后使用该标识符来“突出显示”突出显示。
答案 1 :(得分:1)
每个方法create_XXX
给出id
个创建的对象
id = canvas.create_rectangle(...)
您可以将其保留在列表中,以便在需要时可以访问所有对象。
要更改对象的选项,可以使用此id
canvas.itemconfig(id, fill='blue')
您可以绑定到Canvas
函数,该函数将在您单击左键(<Button-1>
)时执行
canvas.bind('<Button-1>', on_click)
此功能将获得event
,其鼠标位置为event.x
,event.y
,可用于在画布上查找对象
selected_id = canvas.find_overlapping(event.x, event.y, event.x+1, event.y+1)
现在您可以取消选择所有项目,而仅选择单击的项目
for id_ in all_ids:
canvas.itemconfig(id_, fill='red')
if selected_id:
canvas.itemconfig(selected_id, fill='blue')
import tkinter as tk
# --- functions ---
def on_click(event):
#print(event)
selected_id = canvas.find_overlapping(event.x, event.y, event.x+1, event.y+1)
print(selected_id)
for id_ in all_ids:
canvas.itemconfig(id_, fill='red')
if selected_id:
canvas.itemconfig(selected_id, fill='blue')
# --- main ---
root = tk.Tk()
canvas = tk.Canvas()
canvas.pack()
canvas.bind('<Button-1>', on_click)
all_ids = []
for x in range(10, 301, 60):
id_ = canvas.create_rectangle((x, 10, x+50, 60), fill='red')
all_ids.append(id_)
root.mainloop()
文档:Canvas