Python, Tkinter, tkFont: 标签大小调整

2024-05-19 14:14:10 发布

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

我想让标签只有当鼠标在上面时才加下划线。我大部分时间都有问题。我想有一个更简单的方法来做到这一点,但我从来没有玩过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()

Tags: eventbindconfiguredefrootlabelfontunderline
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()

我不确定标签为什么会改变字体大小,但我有一个解决问题的办法。在

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

其次,在<Leave>事件中添加f = tkFont.Font(event.widget, event.widget.cget("font"))可以修复大小更改的问题。在

见下文:

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

相关问题 更多 >