1

我试图让标签只有在鼠标悬停时才加下划线。我大部分都遇到了麻烦。我认为有一种更简单的方法可以做到这一点,但我从来没有玩过 tkFont。当鼠标离开标签时,标签也会调整大小。

from Tkinter import *
import tkFont

def move1(event):
    f = tkFont.Font(lbl1, lbl1.cget("font"))
    f.configure(underline = True)
    lbl1.configure(font=f)

def _move1(event):
    f.configure(underline = False)
    lbl1.configure(font=f)

def move2(event):   
    f = tkFont.Font(lbl2, lbl2.cget("font"))
    f.configure(underline = True)
    lbl2.configure(font=f)

def _move2(event):
    f.configure(underline = False)
    lbl2.configure(font=f)

def move3(event):   
    f = tkFont.Font(lbl3, lbl3.cget("font"))
    f.configure(underline = True)
    lbl3.configure(font=f)

def _move3(event):
    f.configure(underline = False)
    lbl3.configure(font=f)



root=Tk()
root.geometry('100x100+100+100')

f = tkFont.Font()
lbl1 = Label(root, text='Label 1')
lbl1.bind('<Enter>', move1)
lbl1.bind('<Leave>', _move1)
lbl1.pack()
lbl2 = Label(root, text='Label 2')
lbl2.bind('<Enter>', move2)
lbl2.bind('<Leave>', _move2)
lbl2.pack()
lbl3 = Label(root, text='Label 3')
lbl3.bind('<Enter>', move3)
lbl3.bind('<Leave>', _move3)
lbl3.pack()

mainloop()
4

2 回答 2

2

在我看来,最好的解决方案是只使用两种不同的字体,而不是为每个事件重新创建字体。Tkinter 具有“命名字体”的概念,这使得在配置小部件时可以轻松地通过名称引用字体。(命名字体比这更强大,但这不是重点)。

这是在程序开始时创建两种字体的示例:

from Tkinter import *
import tkFont

def on_enter(event):
    event.widget.configure(font="underlined_font")

def on_leave(event):
    event.widget.configure(font="normal_font")


root=Tk()
root.geometry('100x100+100+100')

normal= tkFont.Font(name="normal_font")
underlined = tkFont.Font(name="underlined_font", underline=True)

lbl1 = Label(root, text='Label 1', font="normal_font")
lbl1.bind('<Enter>', on_enter)
lbl1.bind('<Leave>', on_leave)
lbl1.pack()
lbl2 = Label(root, text='Label 2', font="normal_font")
lbl2.bind('<Enter>', on_enter)
lbl2.bind('<Leave>', on_leave)
lbl2.pack()
lbl3 = Label(root, text='Label 3', font="normal_font")
lbl3.bind('<Enter>', on_enter)
lbl3.bind('<Leave>', on_leave)
lbl3.pack()

mainloop()
于 2012-07-25T18:20:02.037 回答
1

我不确定为什么标签改变字体大小的确切问题是什么,但我有一个问题的解决方案。

首先,传入的事件参数,它包含对发生事件的小部件的引用,因此您不再需要为每个标签提供两个函数。

其次,f = tkFont.Font(event.widget, event.widget.cget("font"))<Leave>活动期间添加解决了尺寸变化的问题。

见下文:

from Tkinter import *
import tkFont

def move1(event):
    f = tkFont.Font(event.widget, event.widget.cget("font"))
    f.configure(underline = True)
    event.widget.configure(font=f)


def _move1(event):
    f = tkFont.Font(event.widget, event.widget.cget("font"))
    f.configure(underline = False)
    event.widget.configure(font=f)

root=Tk()
root.geometry('100x100+100+100')

f = tkFont.Font()
lbl1 = Label(root, text='Label 1')
lbl1.bind('<Enter>', move1)
lbl1.bind('<Leave>', _move1)
lbl1.pack()
lbl2 = Label(root, text='Label 2')
lbl2.bind('<Enter>', move1)
lbl2.bind('<Leave>', _move1)
lbl2.pack()
lbl3 = Label(root, text='Label 3')
lbl3.bind('<Enter>', move1)
lbl3.bind('<Leave>', _move1)
lbl3.pack()

mainloop()
于 2012-07-25T10:42:58.977 回答