繁体   English   中英

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

[英]Adaptive resizing for a tkinter Text widget

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

虽然这适用于LabelFrame和大多数其他小部件,但当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 缩小,所有第一个文本小部件都有空间,但两个都不够。 因为没有足够的空间,所以它必须从剩余的小部件中减去空间。 因此,它开始砍掉最后一个文本小部件。

为了解决这个问题,您可以将文本小部件的请求大小设置为一个较小的值,几乎可以适应任何 window 大小,然后通过将 window 的大小设置为一个整体来强制它们增大。 这样pack会先给每个小的window分配足够的空间,等有多余的空间再平均扩容。

例如:

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM