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

时间:2017-11-21 22:49:37

标签: 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

点击微小后

然后搞砸了

text is tiny, but sizing is off

然后在我按下退格键后修复

sizing is fixed after editing text

我该如何解决这个问题?或者,我怎样才能更正确地做到这一点,以便它没有解决方法? 我在Windows 10上使用64.3位Python 3.6.3,如果有帮助的话。

编辑:我为你们所做的一个例子用

戳了戳

1 个答案:

答案 0 :(得分:2)

经过一些测试后,似乎仅在ttk.Entry而非tk.Entry时才会发生。至少有两种解决方法:

  1. 插入然后在字体大小更改后删除条目中的文本
  2. 在字体大小更改后重新配置条目的字体
  3. 以下是一个例子:

    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()