Как я могу связать несколько элементов холста вместе, чтобы изменить их цвет одновременно?

Итак, это линии, которые я создал / нарисовал:

from tkinter import *


root = Tk()

f= Frame(root)
f.pack()
c = Canvas(f,bg = "black")
c.pack()
line1 = c.create_line(10,0,10,50,fill = "white",activefill = "blue",tag = "one")
line_side1 = c.create_line(0,25,10,25,fill= "white", activefill = "blue",tag = "one")
line2 = c.create_line(30,0,30,50,fill = "white",activefill = "blue",tag = "one")
line_side2 = c.create_line(30,25,40,25,fill= "white", activefill = "blue",tag = "one")
c.pack()

root.mainloop()

Итак, теперь я хочу, чтобы все линии стали синего цвета, когда я наведу на них курсор мыши.

Я пытался использовать tag_bind вариант, но было бы полезно, если бы вы могли показать мне, как это сделать.

2 ответа

Решение

Хотя ответ @AleksanderMonk работает нормально, я думаю, что привязка к тегу "one" было бы легче в этом случае, особенно когда вы планируете делать больше строк. Вы можете использовать тег вместо идентификатора в обоих tag_bind и itemconfigure функция:

from tkinter import *

def change_color(event):
    if event.type == "7":   # Enter
        event.widget.itemconfigure("one", fill="blue")
    elif event.type == "8": # Leave
        event.widget.itemconfigure("one", fill="white")

root = Tk()
f = Frame(root)
c = Canvas(f, bg="black")
f.pack()    
c.pack()

line1      = c.create_line(10, 0,10,50, fill="white", tag="one")
line_side1 = c.create_line( 0,25,10,25, fill="white", tag="one")
line2      = c.create_line(30, 0,30,50, fill="white", tag="one")
line_side2 = c.create_line(30,25,40,25, fill="white", tag="one")

c.tag_bind("one", "<Enter>", change_color)
c.tag_bind("one", "<Leave>", change_color)

root.mainloop()

Я думаю, что все, что вам нужно сделать, это составить список всех идентификаторов линий (line1, line2,..) и при наведении просто изменить цвет для всех элементов в списке.

    from tkinter import *

def set_color(event):
    for x in all_ids:
        c.itemconfig(x, fill="blue")
    return

def return_color(event):
    for x in all_ids:
        c.itemconfig(x, fill="white")
    return

all_ids = []

root = Tk()
f = Frame(root)
f.pack()
c = Canvas(f, bg="black")
c.pack()

all_ids.append(c.create_line(10, 0, 10, 50, fill="white"))
all_ids.append(c.create_line(0, 25, 10, 25, fill="white"))
all_ids.append(c.create_line(30, 0, 30, 50, fill="white"))
all_ids.append(c.create_line(30, 25, 40, 25, fill="white"))


for x in all_ids:
    c.tag_bind(x, '<Enter>', set_color)
    c.tag_bind(x, '<Leave>', return_color)

root.mainloop()
Другие вопросы по тегам