Как выделить две разные метки при наведении курсора на любую из них в tkinter?

Я создаю небольшое приложение, используя tkinter, где он показывает вам список работы, выполненной в конкретном заданном интервале, формат, как показано ниже

            co11              col2

   Time done         Activity name

Ниже приведен код. Поскольку два столбца находятся далеко, когда я нахожу курсор на одну из двух меток внутри цикла for, я хочу, чтобы обе метки были выделены для упрощения идентификации имени времени выполнения. Я реализовал метки в макете сетки как отдельные метки.

                      def on_click(e):
                    e.widget['bg']='#fafafa'
                def on_leave(e):
                    e.widget['bg']='#dcdcdc'
                if result1:
                    Label(second_frame, text=start_time[11:], width=115, font=('Tahoma', 15),
                          fg='black',bg='#aaaaaa').grid(row=x,column=0, columnspan=2)
                    x += 1
                    for j in result1:
                        temp = int(j[2]) * int(j[3])
                        # print(j[0][11:], j[1], j[2], j[3], temp)
                        sub_total += temp
                        total_pts += temp
                        e1=Label(second_frame, text=j[0][11:], font=('Tahoma', 12), bg='#dcdcdc', width=71)
                        e1.grid(row=x,column=0)

                        e2=Label(second_frame, text=str(j[1]), font=('Tahoma', 12), bg='#dcdcdc', width=71)
                        e2.grid(row=x,column=1)
                        e1.bind('<Enter>',on_click)
                        e1.bind('<Leave>',on_leave)
                        e2.bind('<Enter>', on_click)
                        e2.bind('<Leave>', on_leave)
                        x += 1

2 ответа

Вы можете связать пары кнопок в каждой строке друг с другом, используя определенный пользователем атрибут кнопки, после чего вы можете легко выделить их вместе.

Ниже приведен пример:

      import tkinter as tk

root = tk.Tk()

def on_click(e):
    e.widget['bg'] = "#fafafa"
    e.widget.peer['bg'] = "#fafafa" # set the peer as well

def on_leave(e):
    e.widget['bg'] = "#dcdcdc"
    e.widget.peer['bg'] = "#dcdcdc" # set the peer as well

for i in range(10):
    e1 = tk.Label(root, text=f"Left {i+1}", width=10, bg="#dcdcdc", font="Tahoma 12")
    e1.grid(row=i, column=0, padx=(0,300))

    e2 = tk.Label(root, text=f"Right {i+1}", width=10, bg="#dcdcdc", font="Tahoma 12")
    e2.grid(row=i, column=1, padx=(300,0))

    e1.bind("<Enter>", on_click)
    e1.bind("<Leave>", on_leave)
    e2.bind("<Enter>", on_click)
    e2.bind("<Leave>", on_leave)

    # link the pair buttons together
    e1.peer = e2
    e2.peer = e1

root.mainloop()

Простым решением может быть сгруппировать элементы, которые необходимо настроить, как в list

Пример

      from tkinter import *

def on_enter(event):
    if event.widget in labels:
        for label in labels:
            label['bg']='#fafafa'

def on_leave(event):
    if event.widget in labels:
        for label in labels:
            label['bg']='#dcdcdc'

root=Tk()

hello_label=Label(root,text='Hello')
hello_label.pack(side='left',pady=20)
world_label=Label(root,text='World')
world_label.pack(side='left',pady=20)
labels=[hello_label,world_label]

root.bind_all('<Enter>',on_enter)
root.bind_all('<Leave>',on_leave)

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