在主框架中放置文本小部件时,文本小部件会将列宽度拉伸得比其他列宽,导致布局变形。
2、解决方案
可以使用以下方法来解决此问题:
- 将文本小部件的宽度和高度设置为 1,并使用网格选项来拉伸它以填充其容器。由于文本小部件的自然大小小于它所在的单元格,因此它不会导致单元格增长。
- 在文本小部件的父容器中使用
columnconfigure()
方法来设置列的最小宽度。这样可以确保文本小部件不会拉伸得太宽。
self.master.columnconfigure(2, minsize=100)
以下是如何使用此解决方案的示例代码:
import tkinter as tk
class MyFrame(tk.Frame):
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.master.rowconfigure(0, weight=1)
self.master.columnconfigure(0, weight=1)
self.grid(sticky=tk.W+tk.E+tk.N+tk.S)
# Establish grids, columns for the master Frame widget
for c in range(5):
# 0,1,2,3,4
self.columnconfigure(c, weight=1)
self.rowconfigure(0, weight=1)
self.rowconfigure(1, weight=1)
self.rowconfigure(2, weight=0)
# Generate Buttons
self.button = dict()
for r in range(5):
self.button[r] = tk.Button(self)
self.button[r].grid(column=r, row=2, sticky=tk.N+tk.S+tk.E+tk.W)
self.button[0].config(command=self.b0, text="red")
self.button[1].config(command=self.b1, text="blue")
self.button[2].config(command=self.b2, text="green")
self.button[3].config(command=self.b3, text="black")
self.button[4].config(command=self.b4, text="open")
# Frame 1
self.f1 = tk.Frame(self, bg="red")
self.f1.grid(row=0, column=0, columnspan=2, rowspan=1, sticky=tk.N+tk.S+tk.W+tk.E)
self.f1.bind("<Button-1>", self.f1_button)
self.label_1_var = tk.StringVar()
self.label_1_var.set("frame 1")
self.label_1 = tk.Label(self.f1, textvariable=self.label_1_var)
self.label_1.grid(row=1, column=1)
# Frame 2
self.f2 = tk.Frame(self, bg="blue")
self.f2.grid(row=1, column=0, columnspan=2, rowspan=1, sticky=tk.N+tk.S+tk.E+tk.W)
self.f2.bind("<Button-1>", self.f2_button)
self.label_2_var = tk.StringVar()
self.label_2_var.set("frame 2")
self.label_2 = tk.Label(self.f2, textvariable=self.label_2_var)
self.label_2.grid(row=1, column=1)
# frame 3
self.f3 = tk.Frame(self, bg="green")
self.f3.grid(row=0, column=2, columnspan=3, rowspan=2, sticky=tk.N+tk.S+tk.E+tk.W)
self.f3.rowconfigure(0, weight=1)
self.f3.rowconfigure(1, weight=0)
self.f3.columnconfigure(0, weight=1)
# list some files to try
files = glob.glob("*")
default_display = ""
for fn in files:
default_display += fn + "\n"
# Text widget
self.f3_text = tk.Text(self.f3, width=1, height=1)
self.f3_text.insert(tk.END, default_display)
self.f3_text.grid(column=0, row=0, sticky=tk.N+tk.S+tk.E+tk.W)
# Text scrollbar
self.sb = tk.Scrollbar(self.f3)
self.sb.grid(column=1, row=0, sticky=tk.N+tk.S+tk.E+tk.W)
self.f3_text.config(yscrollcommand=self.sb.set)
self.sb.config(command=self.f3_text.yview)
# Entry Window
self.f3_entry = tk.Entry(self.f3)
self.f3_entry.grid(column=0, row=1, columnspan=2, sticky=tk.N+tk.S+tk.E+tk.W)
if __name__ == "__main__":
root = tk.Tk()
frame = MyFrame(root)
frame.pack(fill=tk.BOTH, expand=True)
root.mainloop()
希望上述信息对您有所帮助!