Tkinter如何调整字体大小并保持对齐

Dan*_*son 3 python tkinter

我正在编写一个需要缩放的应用程序。使用默认的系统字体“ TkDefaultFont和TkTextFont”,我增加了它们的大小,并得到了想要的结果。问题在于调整大小后,字段标签和字段小部件之间的对齐方式不正确。我试过应用update_idletasks(),但是它什么也没做。将鼠标移到小部件上可以解决此问题,如视频中所示。如果您运行下面的示例,请转到size旋转框,然后更改大小以查看问题。

我的开发系统是Linux,台式机KDE,我不知道这是否是操作系统问题。

指向该问题的简短视频的链接。 对齐问题视频。

import tkinter as tk
import tkinter.ttk as ttk
import tkinter.font as tkfont

root = tk.Tk()
root.rowconfigure(0, weight=1)
root.columnconfigure(99, weight=1)


frame = ttk.Frame(root)
frame.rowconfigure(0, weight=1)
frame.columnconfigure(0, weight=1)

cbo = ttk.Combobox(frame)
cbo.config(
    values=('Test 1', 'Test 2', 'Test 3')
)
cbo.set(value='Test 1')

ent_var = tk.StringVar()
ent = ttk.Entry(frame, textvariable=ent_var)
ent_var.set('Test')


lb_size = ttk.Label(frame, text='size')
spn = ttk.Spinbox(frame,  values=tuple(range(1, 101)))

font1 = tkfont.nametofont('TkDefaultFont')
font2 = tkfont.nametofont('TkTextFont')

lbl_field_name = tk.Label(frame, text='Field Name')
lbl_field_name.grid()


def size(e):
    cfg = font1.actual()
    cfg['size'] = e.widget.get()
    font1.configure(**cfg)
    font2.configure(**cfg)


spn.bind('<<Increment>>', size)
spn.bind('<<Decrement>>', size)


cbo.grid(row=0, column=1, sticky=tk.NSEW)
ent.grid(row=0, column=2, sticky=tk.NSEW)
lb_size.grid(row=0, column=3, sticky=tk.NSEW)
spn.grid(row=0, column=4, sticky=tk.NSEW)
frame.grid(sticky=tk.NSEW)

root.mainloop()
Run Code Online (Sandbox Code Playgroud)

j_4*_*321 5

我发现避免此问题的唯一方法是更改​​每个条目configure()方法的字体。我想更简单的方法是将所有条目放在列表中,请参见下面的代码。

我还注意到,它size()使用旋转框的前一个值,而不是增量/减量后的值。为避免这种情况,建议您使用commandSpinbox 的选项,而不是与<<Increment>>and 的绑定<<Decrement>>(请参见下面的代码)。

最后,您无需检索整个字体设置即可更新大小,只需执行即可font1.configure(size=<newsize>)

import tkinter as tk
import tkinter.ttk as ttk
import tkinter.font as tkfont

root = tk.Tk()
root.rowconfigure(0, weight=1)
root.columnconfigure(99, weight=1)


frame = ttk.Frame(root)
frame.rowconfigure(0, weight=1)
frame.columnconfigure(0, weight=1)

entries = []  # list of all entries

cbo = ttk.Combobox(frame)
cbo.config(
    values=('Test 1', 'Test 2', 'Test 3')
)
cbo.set(value='Test 1')
entries.append(cbo)

ent_var = tk.StringVar()
ent = ttk.Entry(frame, textvariable=ent_var)
ent_var.set('Test')
entries.append(ent)


def size():
    size = spn.get()  # get current spinbox's value
    font1.configure(size=size)
    font2.configure(size=size)
    for e in entries:  # update font in all entries
        e.configure(font=font2)


lb_size = ttk.Label(frame, text='size')
# use the command option to update the font size
spn = ttk.Spinbox(frame, command=size, values=tuple(range(1, 101)))  

font1 = tkfont.nametofont('TkDefaultFont')
font2 = tkfont.nametofont('TkTextFont')

lbl_field_name = ttk.Label(frame, text='Field Name')
lbl_field_name.grid()

cbo.grid(row=0, column=1, sticky=tk.NSEW)
ent.grid(row=0, column=2, sticky=tk.NSEW)
lb_size.grid(row=0, column=3, sticky=tk.NSEW)
spn.grid(row=0, column=4, sticky=tk.NSEW)
frame.grid(sticky=tk.NSEW)

root.mainloop()
Run Code Online (Sandbox Code Playgroud)