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

私の意見では、最善の解決策は、イベントごとにフォントを再作成するのではなく、2つの異なるフォントを使用することです。Tkinterには「名前付きフォント」の概念があり、ウィジェットを構成するときに名前でフォントを簡単に参照できます。(名前付きフォントはそれよりもはるかに強力ですが、それは重要ではありません)。

プログラムの開始時に2つのフォントが作成される例を次に示します。

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

ラベルがフォントサイズを変更する理由についての正確な問題はわかりませんが、質問に対する解決策はあります。

まず、渡されるイベント引数には、イベントが発生したウィジェットへの参照が含まれているため、ラベルごとに2つの関数は必要ありません。

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 に答える