如何在Tkinter中固定Text组件尺寸,避免字体变更时自动缩放?
解决Tkinter Text组件字体变更后宽度异常的问题
你的问题核心在于Text组件初始用字符单位设置了固定宽高,且未配置布局填充规则,导致字体变更后始终保持1字符宽度。结合你的代码,按以下步骤修改即可解决:
关键修改点
- 移除Text的固定宽高,改用布局规则让它填满父框架
删掉Text初始化时的width=1, height=1,同时给Text的grid布局加上sticky="nsew",让它能拉伸填满所在单元格。 - 给父框架配置行列权重
对reader_frame设置行列权重,确保Text组件能跟随框架尺寸自适应。 - 保留父框架的
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
相关产品推荐
相关产品推荐

