更改字体大小时如何使条目小部件的标签位置正确更新?
How do I get the label position of entry widgets to update properly when changing the font size?
我正在创建一个 tkinter ttk GUI,我制作了一些 select GUI 大小的单选按钮。这会改变整个应用程序的全局字体大小。
我做了一个快速脚本来演示它。
import tkinter as tk
from tkinter import ttk
import tkinter.font
UI_SIZES = ["Tiny", "Small", "Normal", "Large", "Huge"]
TINY_FONT_SIZE = 8
SMALL_FONT_SIZE = 12
NORMAL_FONT_SIZE = 16
LARGE_FONT_SIZE = 18
HUGE_FONT_SIZE = 22
root = tk.Tk()
ui_size = tk.StringVar(root, "Normal")
entry_text = tk.StringVar(root, "Entry Text")
def text_size_callback(*_args):
"""change the program font size when the font_size variable changes"""
font = tkinter.font.nametofont("TkDefaultFont")
selected_size = ui_size.get()
if selected_size == "Tiny":
font.configure(size=TINY_FONT_SIZE)
elif selected_size == "Small":
font.configure(size=SMALL_FONT_SIZE)
elif selected_size == "Normal":
font.configure(size=NORMAL_FONT_SIZE)
elif selected_size == "Large":
font.configure(size=LARGE_FONT_SIZE)
elif selected_size == "Huge":
font.configure(size=HUGE_FONT_SIZE)
root.option_add("*Font", font)
ui_size.trace('w', text_size_callback)
ui_size.set("Normal")
ui_radio_group = ttk.Frame(root)
ui_size_radios = []
for sizeval in UI_SIZES:
ui_size_radios.append(ttk.Radiobutton(
ui_radio_group,
text=sizeval,
variable=ui_size,
value=sizeval
))
text_entry = ttk.Entry(ui_radio_group, textvariable=entry_text)
i = 0
for sizeradio in ui_size_radios:
sizeradio.grid(row=i, column=0, sticky=tk.W)
i += 1
text_entry.grid(row=2, column=1)
ui_radio_group.pack()
root.mainloop()
除了条目(和组合框)内的标签外,效果很好。文本本身会调整大小,但标签不会,直到文本被编辑。这使得文本条目看起来很奇怪。
这里是启动时
点击tiny后就搞砸了
然后在我按退格键后修复
我该如何解决这个问题?或者,我怎样才能更正确地做到这一点,使其在没有变通办法的情况下工作?
我在 Windows 10,使用 Python 3.6.3 64 位,如果有帮助的话。
编辑:我举了个例子给大家戳一下
经过一些测试,它似乎只发生在 ttk.Entry
,而不是 tk.Entry
。至少有两个解决方法:
- 在字号改变后在条目中插入然后删除文本
- 修改字号后重新配置条目的字体
这是一个例子:
import tkinter as tk
from tkinter import ttk
import tkinter.font as tkfont
def change_fontsize():
font.configure(size=30)
def change_fontsize_1():
font.configure(size=20)
# workaround 1
entry.insert(0, ' ')
entry.delete(0)
def change_fontsize_2():
font.configure(size=5)
# workaround 2
entry.configure(font=font)
root = tk.Tk()
font = tkfont.Font(root)
entry = ttk.Entry(root, font=font)
entry.insert(0, 'Entry Text')
entry.pack()
ttk.Button(root, text='Change size, no workaround', command=change_fontsize).pack()
ttk.Button(root, text='Change size, workaround 1', command=change_fontsize_1).pack()
ttk.Button(root, text='Change size, workaround 2', command=change_fontsize_2).pack()
root.mainloop()
我正在创建一个 tkinter ttk GUI,我制作了一些 select GUI 大小的单选按钮。这会改变整个应用程序的全局字体大小。
我做了一个快速脚本来演示它。
import tkinter as tk
from tkinter import ttk
import tkinter.font
UI_SIZES = ["Tiny", "Small", "Normal", "Large", "Huge"]
TINY_FONT_SIZE = 8
SMALL_FONT_SIZE = 12
NORMAL_FONT_SIZE = 16
LARGE_FONT_SIZE = 18
HUGE_FONT_SIZE = 22
root = tk.Tk()
ui_size = tk.StringVar(root, "Normal")
entry_text = tk.StringVar(root, "Entry Text")
def text_size_callback(*_args):
"""change the program font size when the font_size variable changes"""
font = tkinter.font.nametofont("TkDefaultFont")
selected_size = ui_size.get()
if selected_size == "Tiny":
font.configure(size=TINY_FONT_SIZE)
elif selected_size == "Small":
font.configure(size=SMALL_FONT_SIZE)
elif selected_size == "Normal":
font.configure(size=NORMAL_FONT_SIZE)
elif selected_size == "Large":
font.configure(size=LARGE_FONT_SIZE)
elif selected_size == "Huge":
font.configure(size=HUGE_FONT_SIZE)
root.option_add("*Font", font)
ui_size.trace('w', text_size_callback)
ui_size.set("Normal")
ui_radio_group = ttk.Frame(root)
ui_size_radios = []
for sizeval in UI_SIZES:
ui_size_radios.append(ttk.Radiobutton(
ui_radio_group,
text=sizeval,
variable=ui_size,
value=sizeval
))
text_entry = ttk.Entry(ui_radio_group, textvariable=entry_text)
i = 0
for sizeradio in ui_size_radios:
sizeradio.grid(row=i, column=0, sticky=tk.W)
i += 1
text_entry.grid(row=2, column=1)
ui_radio_group.pack()
root.mainloop()
除了条目(和组合框)内的标签外,效果很好。文本本身会调整大小,但标签不会,直到文本被编辑。这使得文本条目看起来很奇怪。
这里是启动时
点击tiny后就搞砸了
然后在我按退格键后修复
我该如何解决这个问题?或者,我怎样才能更正确地做到这一点,使其在没有变通办法的情况下工作? 我在 Windows 10,使用 Python 3.6.3 64 位,如果有帮助的话。
编辑:我举了个例子给大家戳一下
经过一些测试,它似乎只发生在 ttk.Entry
,而不是 tk.Entry
。至少有两个解决方法:
- 在字号改变后在条目中插入然后删除文本
- 修改字号后重新配置条目的字体
这是一个例子:
import tkinter as tk
from tkinter import ttk
import tkinter.font as tkfont
def change_fontsize():
font.configure(size=30)
def change_fontsize_1():
font.configure(size=20)
# workaround 1
entry.insert(0, ' ')
entry.delete(0)
def change_fontsize_2():
font.configure(size=5)
# workaround 2
entry.configure(font=font)
root = tk.Tk()
font = tkfont.Font(root)
entry = ttk.Entry(root, font=font)
entry.insert(0, 'Entry Text')
entry.pack()
ttk.Button(root, text='Change size, no workaround', command=change_fontsize).pack()
ttk.Button(root, text='Change size, workaround 1', command=change_fontsize_1).pack()
ttk.Button(root, text='Change size, workaround 2', command=change_fontsize_2).pack()
root.mainloop()