Python3/Tkinter重绘网格时如何移除多余列/行?
解决Tkinter网格布局切换后残留空行列的问题
嘿,这个问题我之前折腾过好一会儿!你猜的没错,问题根源就是那些grid_columnconfigure和grid_rowconfigure的配置——这些设置是持久化的,一旦你给某行列设置了weight和uniform,哪怕上面没有组件,Tkinter还是会保留这些配置,导致网格“记住”旧的行列结构,从而出现空列/空行。
解决思路
每次切换布局前,先清除旧的行列配置:把之前设置过权重的行列,将weight重置为0,同时取消uniform分组。这样网格就会完全根据新布局的行列来计算空间分配。
修改后的代码
我调整了你的refresh方法,加上了重置旧行列配置的逻辑:
import tkinter as tk class TestGrid(tk.Frame): def __init__(self, master): tk.Frame.__init__(self, master, bg='white') colors = ['cyan', 'magenta', 'green', 'gold', 'lavender', 'purple'] self.switch = True self.widgets = [] for i in range(6): self.widgets.append(tk.Label(self, text=i, bg=colors[i])) def refresh(self, *args): self.switch = not self.switch for w in self.widgets: w.grid_forget() # 关键:先重置所有可能存在的行列配置 # 因为之前最多用到3行3列,所以遍历0-2的索引 for idx in range(3): self.grid_columnconfigure(idx, weight=0, uniform="") self.grid_rowconfigure(idx, weight=0, uniform="") # 根据当前布局设置新的行列配置 positions = [(0, 0), (1, 0), (2, 0), (0, 1), (1, 1), (2, 1)] for i in range(6): c, r = positions[i][0], positions[i][1] if self.switch: c, r = r, c self.grid_columnconfigure(c, weight=1, uniform="aaa") self.grid_rowconfigure(r, weight=1, uniform="bbb") self.widgets[i].grid(column=c, row=r, sticky=tk.NSEW) def main(): root = tk.Tk() root.geometry('400x400+20+20') btn = tk.Button(root, text="click me") btn.pack(side=tk.TOP, fill=tk.X) frm = TestGrid(root) frm.pack(fill=tk.BOTH, expand=1, padx=5, pady=5) frm.refresh() btn.bind("<Button-1>", frm.refresh) root.mainloop() if __name__ == '__main__': main()
为什么这样有效?
grid_columnconfigure(idx, weight=0)会把目标列的权重设为0,这样它不会再占据额外空间;- 清空
uniform分组,避免旧的分组规则影响新布局; - 之后再根据新布局的行列重新设置权重和分组,这样网格就只会关注当前需要的行列了。
现在你点击按钮切换布局时,就不会再出现多余的空列或空行啦!
内容的提问来源于stack exchange,提问作者Andrea Pattarini
相关产品推荐
相关产品推荐

