python - 更改字体大小时如何使条目小部件的标签位置正确更新?

标签 python python-3.x tkinter ttk

我正在创建一个 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()

这很好用,除了条目(和组合框)内的标签。文本本身会调整大小,但标签不会,直到文本被编辑。这使得文本条目看起来很奇怪。

这里是启动状态

normal text setting, nothing weird

然后点了tiny之后就乱了

text is tiny, but sizing is off

然后按退格键修复

sizing is fixed after editing text

我该如何解决这个问题?或者,我怎样才能更正确地做到这一点,使其在没有变通办法的情况下工作? 我在 Windows 10 上,使用 Python 3.6.3 64 位,如果有帮助的话。

编辑:我做了一个例子给大家戳

最佳答案

经过一些测试,它似乎只发生在ttk.Entry,而不是tk.Entry。至少有两种解决方法:

  1. 在字号改变后在条目中插入然后删除文本
  2. 在字号改变后重新配置条目的字体

这是一个例子:

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/

相关文章:

python - 使用 tkinter lib 在 Python 中显示表情符号/符号

python - 配置时的 CFLAGS 和 gcc 未在 makefile 中传递

python - Python制作命名空间包的方法

python - 使用python的字符串中最接近的字符

python - 重新格式化此 json 输出时出现问题吗?

python - 列表中的 Tkinter Entry 小部件都保存相同的数据

python - pandas.DataFrame.round() 不会在所需位数后截断小数值

python - 如何打印按点数排序? Python

python - 如何在 Tkinter 中实现不确定的进度条?

python - Tkinter 'label' 小部件 - 换行符随机添加空格