问题描述
我正在使用 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:],12),bg='#dcdcdc',width=71)
e1.grid(row=x,column=0)
e2=Label(second_frame,text=str(j[1]),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
解决方法
您可以使用按钮的用户定义属性将每行中的成对按钮相互链接,然后您可以轻松地将它们一起突出显示。
下面是一个例子:
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}",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()
更新:连续超过 2 个条目的示例:
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}",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()