tkinter 文本小部件的自适应调整大小

Adaptive resizing for a tkinter Text widget

我一直在尝试创建一个包含两个 Text() 小部件的应用程序,这两个小部件都可以在 window 大小更改时动态调整大小。在我一直使用 root.pack() 管理器之前,使用 fill='both'expand=True

虽然这适用于 LabelFrames 和大多数其他小部件,但当 Text 小部件的大小调整为小于其原始尺寸时,它不起作用。有没有办法动态调整 Text 小部件的大小?

例如

import tkinter as tk

window = tk.Tk()
editor = tk.Text(bg='red')
editor.pack(side='top',fill='both',expand=True)
output = tk.Text(bg='green')
output.pack(side='top',fill='both',expand=True)

window.mainloop()

Tkinter 将尝试满足文本小部件的请求大小。由于您没有指定大小,文本小部件将请求 80x24 的大小。当您将 window 的大小调整得更小时,pack 会尝试按照其请求的大小为所有内容腾出空间,并且它会按堆叠顺序执行此操作。

随着 window 缩小,所有第一个文本小部件都有空间,但两个都不够。因为没有足够的空间,它必须从剩余的小部件中减去 space。因此,它开始砍掉最后一个文本小部件。

为了解决这个问题,您可以将请求的文本小部件的大小设置为适合几乎任何 window 大小的较小值,然后通过设置 window 作为一个整体。这样,pack会先给每个小的window分配足够的space,等多了space.

再平均扩容

例如:

import tkinter as tk

window = tk.Tk()
window.geometry("400x400")

editor = tk.Text(bg='red', width=1, height=1)
output = tk.Text(bg='green', width=1, height=1)

editor.pack(side='top',fill='both',expand=True)
output.pack(side='top',fill='both',expand=True)

window.mainloop()

另一种解决方案是使用 grid,它允许您指定行和列的大小应该一致。

import tkinter as tk

window = tk.Tk()

editor = tk.Text(bg='red')
output = tk.Text(bg='green')

editor.grid(row=0, column=0, sticky="nsew")
output.grid(row=1, column=0, sticky="nsew")

window.grid_columnconfigure(0, weight=1)
window.grid_rowconfigure((0,1), weight=1, uniform=1)

window.mainloop()