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

如何在Tkinter中固定Text组件尺寸,避免字体变更时自动缩放?

解决Tkinter Text组件字体变更后宽度异常的问题

你的问题核心在于Text组件初始用字符单位设置了固定宽高,且未配置布局填充规则,导致字体变更后始终保持1字符宽度。结合你的代码,按以下步骤修改即可解决:

关键修改点

  1. 移除Text的固定宽高,改用布局规则让它填满父框架
    删掉Text初始化时的width=1, height=1,同时给Text的grid布局加上sticky="nsew",让它能拉伸填满所在单元格。
  2. 给父框架配置行列权重
    对reader_frame设置行列权重,确保Text组件能跟随框架尺寸自适应。
  3. 保留父框架的grid_propagate(0)
    这个设置是正确的,它能阻止父框架因子组件尺寸变化而改变自身大小。

修改后的完整代码

from tkinter import *

# main window
root = Tk()
root.state('zoomed')
root.geometry("1200x800")

frame_left = Frame(root, padx=10, pady=10)
frame_left.grid(column=0, row=0, columnspan=1) #buttons

Button(frame_left, text="Hot", command=lambda: get_json(2, 0)).grid(column=0, row=2)
Button(frame_left, text="New", command=lambda: get_json(3, 0)).grid(column=0, row=3)
Button(frame_left, text="Controversial", command=lambda: get_json(0, 0)).grid(column=0, row=4)
Button(frame_left, text="Top today", command=lambda: get_json(6, 1)).grid(column=0, row=5)
Button(frame_left, text="Top week", command=lambda: get_json(6, 2)).grid(column=0, row=6)
Button(frame_left, text="Top month", command=lambda: get_json(6, 3)).grid(column=0, row=7)
Button(frame_left, text="Top year", command=lambda: get_json(6, 4)).grid(column=0, row=8)
Button(frame_left, text="Top all time", command=lambda: get_json(6, 5)).grid(column=0, row=9)

for widget in frame_left.winfo_children():
    widget.grid(padx=8, pady=8, sticky="WE")

frame_right = Frame(root, padx=10, pady=10)
frame_right.grid(column=2, row=0, columnspan=2) #textbox

frame_center = Frame(root, padx=10, pady=10)
frame_center.grid(column=0, row=1) #listbox

listbox = Listbox(frame_center, width=40, height=20)
listbox.insert(0, "This list is currently empty. Click on some of the buttons on the left to grab new posts.")
listbox.grid(column=0, row=1)
listbox.bind('<<ListboxSelect>>', lambda x: get_story())

scrollbar = Scrollbar(frame_center, orient='horizontal', command=listbox.xview)
scrollbar.grid(row=2, column=0, sticky="WE")

reader_frame = Frame(frame_right, width=400, height=400)
reader_frame.grid_propagate(0)
# 给reader_frame配置行列权重,让第0行第0列的单元格可拉伸
reader_frame.grid_rowconfigure(0, weight=1)
reader_frame.grid_columnconfigure(0, weight=1)
reader_frame.grid(row=0, column=0)

# 移除width和height,添加sticky让Text填满单元格
reader = Text(reader_frame, wrap="word")
reader.grid(column=0, row=0, sticky="nsew")
reader.configure(state='disabled')

# 示例:模拟修改字体的函数,替换成你自己的逻辑即可
def change_font():
    reader.configure(state='normal')
    # 设置新字体,比如字号16的微软雅黑
    reader.configure(font=('Microsoft Yahei', 16))
    reader.configure(state='disabled')

# 测试按钮,验证字体修改效果
test_btn = Button(frame_right, text="测试修改字体", command=change_font)
test_btn.grid(row=1, column=0, pady=10)

root.mainloop() 

原理说明

  • sticky="nsew"让Text组件在上下左右四个方向紧贴单元格边界,随单元格大小变化自动拉伸。
  • grid_rowconfigure/grid_columnconfigure设置权重为1,意味着父框架固定尺寸时,该行列会占用所有可用空间。
  • 移除width和height后,Text不再以字符为单位固定尺寸,而是完全由布局规则控制大小,字体变更只会改变文字显示大小,不会影响组件本身的尺寸。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:30:50