【问题标题】:Stop text widget from changing size with font size?阻止文本小部件随字体大小改变大小?
【发布时间】:2019-12-12 16:00:57
【问题描述】:

当我更改字体大小时,Tkinter 'ScrolledText' 小部件会更改大小。 “文本”小部件也存在此问题。

我按照建议in this post 使用“.grid_propagate(False)”解决了使用文本小部件字体大小调整父框架大小的问题。

我在 Text 小部件上尝试了 '.grid_propagate(False)' 也无济于事。文本小部件仅在使用 'sticky=nsew' 时保持相同大小,但这会拉伸文本小部件以填充父框架。有什么办法可以解决这个问题吗?

import tkinter as tk
from tkinter.scrolledtext import ScrolledText
window = tk.Tk();
PW1 = tk.PanedWindow(master=window,orient='vertical',bg="#E0E0E0",bd=9)
PW1.pack(side='left',expand='True',fill='both')      
PW1.grid_propagate(False)              
PW1.grid_rowconfigure(0, weight=1)       
PW1.grid_columnconfigure(0, weight=1)
textField1 = ScrolledText(master=PW1,font=('Times New Roman',12))
textField1.grid(row=0, column=0, padx=5, pady=5,sticky='nsew')
window.mainloop()  

【问题讨论】:

    标签: python python-3.x tkinter widget


    【解决方案1】:

    这是一个难题,我从未见过任何有关其工作原理的可用文档。然而,在这个线程中有一个提示:If the text changes the size of the the and widget changes the size

    经过大量的试验和错误,我终于让它与pack() 一起工作。我没有成功使用grid()

    我不完全理解您打算如何使用PanedWindow(),所以我将提供一个使用Frame() 的示例:

    import tkinter as tk
    from tkinter.scrolledtext import ScrolledText
    
    window = tk.Tk()
    
    # Container will not expand when window gets bigger but will
    # shrink as window gets smaller
    container = tk.Frame(window, width=300, height=200, bg='tan')
    container.pack()
    container.pack_propagate(False)
    
    # textField1 will not cause container size change
    textField1 = ScrolledText(container,font=('Times New Roman',12))
    textField1.pack(padx=5, pady=5)
    
    # Changing font size for testing purposes
    def change_font(event):
        textField1.config(font=('Times New Roman',24))
    window.bind('<space>', change_font)
    
    window.mainloop()
    

    【讨论】:

    • “我从未见过任何关于其工作原理的可用文档。” - 确切的工作原理记录在grid 和 @987654323 的规范 tcl/tk 文档中@。他们解释了在布局小部件时如何使用可用空间。
    【解决方案2】:

    一个简单的解决方案是给文本小部件一个不自然的小尺寸(例如:1x1),并让包含窗口通过packplacegrid 确定小部件的实际大小几何管理器选项。只要请求的大小小于实际大小,用户就永远不会看到它增长。

    从技术上讲,小部件仍然会增长,但除非您实际上只是在 GUI 中给它一个很小的位置,否则用户不会看到它增长,因为它请求的大小总是小于实际大小。

    这是一个示例,使用您的代码作为起点。

    import tkinter as tk
    from tkinter.scrolledtext import ScrolledText
    
    window = tk.Tk();
    window.geometry("400x400")
    
    def set_font(size):
        textField1.configure(font=('Times new Roman', size))
    
    f = tk.Frame(window)
    f.pack(side="bottom", fill="x")
    for size in (8, 12, 18, 24):
        b = tk.Button(f, text=size, width=2, command=lambda size=size: set_font(size))
        b.pack(side="left")
    
    
    PW1 = tk.PanedWindow(master=window,orient='vertical',bg="#E0E0E0",bd=9)
    PW1.pack(side='left',expand='True',fill='both')
    PW1.grid_propagate(False)
    PW1.grid_rowconfigure(0, weight=1)
    PW1.grid_columnconfigure(0, weight=1)
    textField1 = ScrolledText(master=PW1,font=('Times New Roman',12), width=1, height=1)
    textField1.grid(row=0, column=0, padx=5, pady=5,sticky='nsew')
    
    window.mainloop()
    

    另一种解决方案是像您所做的那样在包含文本小部件的小部件中关闭几何传播,然后使用该小部件来控制大小。无论文本小部件尝试设置什么大小,它都将是控制实际大小的包含小部件。

    我在 Text 小部件上尝试过 '.grid_propagate(False)' 也无济于事。

    这是因为grid_propagate 会影响子级对小部件的影响。由于您的文本小部件没有任何子小部件,因此该命令无效。

    【讨论】:

    • 谢谢,但是当文本小部件被拉伸时,此解决方案有效。所以如果我想水平堆叠两个小部件,我必须有子框架,对吧?
    • @Raj:我不明白你的问题。为此,要使用几何传播,文本小部件需要位于子框架内并配置为填充该框架。但是,您可以将该框架放在任何您想要的位置,而不必拉伸它。
    • 谢谢,这就是我想问的“文本小部件必须填充框架”。
    • @Raj: 明确一点:它必须填充 a 框架,但是您可以专门为文本小部件创建一个特殊的框架,它只包含文本小部件.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    相关资源
    最近更新 更多