You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何阻止Tkinter ScrolledText组件随字体大小变化调整尺寸?

问题:固定ScrolledText组件尺寸不随字体大小变化

当增大字体尺寸时,ScrolledText组件会随之变大,希望无论如何调整字体大小,都保持ScrolledText组件的尺寸不变。字体大小为10和15时的组件状态分别对应两张截图。

如截图所示,ScrolledText组件会随字体尺寸变化而改变大小,需要阻止这种情况发生。曾参考Stack Overflow上的《如何阻止Tkinter Text组件随字体变化而调整大小?》方案,但未解决问题,以下是代码示例:

# import GUI
import tkinter as tk
from tkinter import ttk
from tkinter import scrolledtext
from tkinter import Spinbox

# create instance
win = tk.Tk()

# title name
win.title("Notepad ver.1.0")

# resizable option
win.resizable(True, True)

# geometry
win.geometry("1900x1000")


def click(e):
    GetFont = 'Arial, ' + str(FontSize.get())
    scr.configure(font=GetFont)

# frame 1
frame1 = ttk.LabelFrame(win, text='')
frame1.grid(column=0, row=0)

# font size
ttk.Label(frame1, text='Font Size:').grid(column=1, row=2)

# font spin box
FontSize = Spinbox(frame1, from_=10, to=60, width=4)
FontSize.grid(column=2, row=2)


# frame2
frame2 = ttk.LabelFrame(win, text='')
# set the width and height of your frame as desired using ipadx and ipady
frame2.grid(column=0, row=7, sticky=tk.S, ipadx=100, ipady=100)
# disable grid propagation to prevent resizing on font size changes
frame2.grid_propagate(False)

# scrolled text
ScrWidth = 150
ScrHight = 30
scr = scrolledtext.ScrolledText(frame2, width=ScrWidth, height=ScrHight)
scr.pack(fill="both", expand=True)
scr.config(font='Arial, 10')
scr.grid_propagate(False)

scr.insert(tk.INSERT, 'Sample Text')

win.bind("<ButtonRelease-1>", click)

# start GUI
win.mainloop()

解决方法

问题核心在于布局方式与尺寸传播控制不匹配,调整后的代码如下:

# import GUI
import tkinter as tk
from tkinter import ttk
from tkinter import scrolledtext
from tkinter import Spinbox

# create instance
win = tk.Tk()

# title name
win.title("Notepad ver.1.0")

# resizable option
win.resizable(True, True)

# geometry
win.geometry("1900x1000")


def adjust_font():
    GetFont = 'Arial, ' + str(FontSize.get())
    scr.configure(font=GetFont)

# frame 1
frame1 = ttk.LabelFrame(win, text='')
frame1.grid(column=0, row=0)

# font size
ttk.Label(frame1, text='Font Size:').grid(column=1, row=2)

# font spin box - 用command绑定更精准
FontSize = Spinbox(frame1, from_=10, to=60, width=4, command=adjust_font)
FontSize.grid(column=2, row=2)


# frame2
frame2 = ttk.LabelFrame(win, text='')
# 直接设置frame的固定宽高,替代ipadx/ipady
frame2.grid(column=0, row=7, sticky=tk.S)
frame2.config(width=1200, height=600)
# 禁用pack布局的尺寸传播(因为ScrolledText用pack布局)
frame2.pack_propagate(False)

# scrolled text - 不设置width/height,让它填充frame
scr = scrolledtext.ScrolledText(frame2)
scr.pack(fill="both", expand=True)
scr.config(font='Arial, 10')

scr.insert(tk.INSERT, 'Sample Text')

# start GUI
win.mainloop()

关键修改说明

  • 调整尺寸传播控制:因为ScrolledText使用pack布局,所以把frame2.grid_propagate(False)改成frame2.pack_propagate(False),阻止子组件改变容器尺寸。
  • 固定容器尺寸:给frame2直接设置width和height,替代ipadx/ipady,明确容器的固定大小。
  • 优化事件绑定:把全局鼠标释放事件改成Spinbox的command参数,只在调整字体大小后触发修改,避免不必要的触发。
  • 移除ScrolledText的宽高属性:让它通过pack(fill="both", expand=True)填充整个frame2,依赖frame2的固定尺寸保持自身大小。

内容的提问来源于stack exchange,提问作者Ian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 16:25:18