我正在创建一个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()
除了条目(和组合框)中的标签之外,这很有效。在编辑文本之前,文本本身会调整大小,但标签不会调整大小。这使得文本条目看起来很奇怪。
这是在启动时
点击微小后
然后搞砸了然后在我按下退格键后修复
我该如何解决这个问题?或者,我怎样才能更正确地做到这一点,以便它没有解决方法? 我在Windows 10上使用64.3位Python 3.6.3,如果有帮助的话。
编辑:我为你们所做的一个例子用
戳了戳答案 0 :(得分:2)
经过一些测试后,似乎仅在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()