如何处理用户创建的小部件?

时间:2019-11-07 17:12:28

标签: python tkinter

我正在使用一个简单的函数,该函数在画布上创建矩形(具有用户指定的大小)。

def create_some_rectangle(self):
    self.canvas.create_rectangle(master, x0, y0, x1, y1, fill='somecolor')
    # user specify x0 y0 x1 y1

但是我想添加一些内容以供将来寻址(通过单击鼠标突出显示特定的小部件)。如果将有1个矩形,这很简单,但是用户创建了许多矩形,因此我需要一些特殊的东西来分别突出显示每个小部件。

  1. 用户在小部件上单击鼠标左键
  2. 小部件亮点
  3. 用户单击画布(突出显示的小部件除外)并突出显示过期

我怎么能意识到这一点?这个\有什么有用的想法吗?

2 个答案:

答案 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.xevent.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