我正在创建一个 tkinter ttk GUI,我制作了一些选择 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()
关于python - 更改字体大小时如何使条目小部件的标签位置正确更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47424052/