如何阻止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
相关产品推荐
相关产品推荐

