当鼠标悬停在tkinter中的任意一个标签上时,如何突出显示两个不同的标签?

2024-05-23 22:40:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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

Tags: textbindon标签widthframetemplabel
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()

更新:一行中有两个以上条目的示例:

import tkinter as tk

root = tk.Tk()

def on_click(e):
    for entry in rows[e.widget.row]:
        entry['bg'] = "#fafafa"

def on_leave(e):
    for entry in rows[e.widget.row]:
        entry['bg'] = "#dcdcdc"

# use 2-dimensional list to store the entries
rows = []
for i in range(10):
    entries = []  # store entries in a row
    for c in range(4):
        e = tk.Label(root, text=f"Item {i+1},{c+1}", width=10, bg="#dcdcdc", font="Tahoma 12")
        e.grid(row=i, column=c, padx=50)
        e.bind("<Enter>", on_click)
        e.bind("<Leave>", on_leave)
        e.row = i  # save the row number
        entries.append(e)
    rows.append(entries)

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()

相关问题 更多 >