2012-07-24 223 views
1

我想让标签仅在鼠标悬停时才加下划线。我遇到了大部分问题。我认为有一个更简单的方法来做到这一点,但我从来没有玩过tkFont。当鼠标离开标签时,标签也会被调整大小。Python,Tkinter,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() 

回答

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

我从来不知道的event.widget,它帮助了很多谢谢 – Crispy 2012-07-25 21:36:31

1

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

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

其次,在<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() 
相关问题