Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在更改字体大小时使条目小部件的标签位置正确更新?_Python_Python 3.x_Tkinter_Ttk - Fatal编程技术网

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

Python 如何在更改字体大小时使条目小部件的标签位置正确更新?,python,python-3.x,tkinter,ttk,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_FON

我正在创建一个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后搞砸了

然后在我点击backspace后修复

我怎样才能解决这个问题?或者,我如何才能更正确地执行此操作,使其在没有解决方法的情况下工作? 如果有帮助的话,我使用的是Windows10,使用的是Python3.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()
    

    您使用的是
    grid()
    还是
    pack()
    ?顶部使用的是
    pack()
    ,底部使用的是
    grid()
    条目中的标签是什么意思,不是指文本吗?当然。我原以为它们是标签对象,但我是这方面的新手。如果你能创建一个这种行为的版本,它可能会增加解决的机会,因为我们也会有一些东西需要修补。这是一个非常出色的答案,但它要求我的文本设置器知道我需要“更正”的每个条目小部件。在条目本身中是否有允许我重置字体属性的事件?此外,这是我应该在某处归档的ttk错误吗?@DTreth我认为这是一个ttk错误,我刚刚检查了tcl脚本而不是python是否出现了相同的问题。如果尚未报告错误,则填写错误报告是值得的。关于第一条注释,由于修改的是字体对象,我怀疑是否可以使用任何类型的事件来重新配置条目。目前我看到的唯一解决方案是,列出共享相同字体的所有条目,并在更改字体大小时迭代重新配置所有条目。