清空时为什么框架保持非空尺寸?

时间:2016-06-18 14:54:46

标签: python tkinter

我有一系列要完成的任务。该列表有几个子组,我想一起显示。为此,我为每个子组创建了一个框架,并使用grid()显示相应框架中的每个任务。任务完成后,我会销毁相应的标签。

当一个子组从一开始就是空的时候,tkinter会将帧的大小减小到0,而我却看不到它。但是当一个具有任务的子组变空时,它似乎具有最小尺寸并且不会消失。有没有办法防止这种情况?

以下是我的问题的一个例子:frame0没有出现,因为它是空的(这很好)。但即使在破坏了frame1的标签(带按钮)之后,frame1仍然出于某种原因保留了一行。

import tkinter as tk

window=tk.Tk()

frame0=tk.Frame(window,bg='green')
frame1=tk.Frame(window,bg='red')
frame2=tk.Frame(window,bg='blue')
window.grid_columnconfigure(0,weight=1)

frame0.grid(sticky='ew')
frame1.grid(sticky='ew')
frame2.grid(sticky='ew')

labelList1=[]
for i in range(2):
    labelList1.append(tk.Label(frame1,text='Task type 1'))
    labelList1[-1].grid(sticky='ew',pady=5)

tk.Label(frame2,text='Task type 2: 1').grid(sticky='ew',pady=5)
tk.Label(frame2,text='Task type 2: 2').grid(sticky='ew',pady=5)

for i in range(2):
    tk.Button(window,text='Destroy {}'.format(i),command=labelList1[i].destroy).grid()

window.mainloop()

我找到了一种解决方法,只使用一个框架,使用第1到第100行为子组0,101到200到子组1,等等。但我不会发现这个优雅。

1 个答案:

答案 0 :(得分:3)

如果没有子窗口小部件,Tkinter将不会调整帧的大小。因此,如果您有一个回调,一次删除所有标签,框架根本不会调整大小。一个简单的(如果有点kludgy)解决方法是将虚拟框架窗口小部件添加到frame1。例如,添加此行

tk.Frame(frame1).grid()
labelList1循环之前

FWIW,这是代码的变体,它会破坏标签和相应的按钮。

import tkinter as tk

window=tk.Tk()

frame0=tk.Frame(window,bg='green')
frame1=tk.Frame(window,bg='red')
frame2=tk.Frame(window,bg='blue')
window.grid_columnconfigure(0,weight=1)

frame0.grid(sticky='ew')
frame1.grid(sticky='ew')
frame2.grid(sticky='ew')

tk.Frame(frame1).grid()

num_tasks = 3
labelList1=[]
for i in range(num_tasks):
    labelList1.append(tk.Label(frame1,text='Task type 1: {}'.format(i)))
    labelList1[-1].grid(sticky='ew',pady=5)

tk.Label(frame2,text='Task type 2: 1').grid(sticky='ew',pady=5)
tk.Label(frame2,text='Task type 2: 2').grid(sticky='ew',pady=5)

def kill_label_and_button(l, b):
    l.destroy()
    b.destroy()

for i in range(num_tasks):
    b = tk.Button(window,text='Destroy {}'.format(i))
    b.config(command=lambda l=labelList1[i], b=b: kill_label_and_button(l, b))
    b.grid()

window.mainloop()