这是一个Tkinter程序,有两种模式可供选择。选择“蓝色”'显示蓝框并选择“绿色”。显示绿框。
执行此操作的代码:
from tkinter import Tk, Frame, Button, ttk
class App():
def __init__(self, parent):
self.parent = parent
self.build_mode_selector_frame()
self.build_green_frame()
self.build_blue_frame()
def build_mode_selector_frame(self):
choices = ['blue','green']
self.mode_selector_frame = Frame(self.parent, width=300, height=50)
self.mode_selector = ttk.Combobox(self.mode_selector_frame, values=choices)
self.mode_selector.bind("<<ComboboxSelected>>", self.on_mode_changed)
self.mode_selector.grid(row=0, column=1)
self.mode_selector_frame.grid(row=0, column=0)
def build_blue_frame(self):
self.blue_frame = Frame(self.parent, width=300, height=50, background="blue")
self.blue_frame.grid(row=1, column=0)
#Button(self.blue_frame).grid(row=0, column=1)
def build_green_frame(self):
self.green_frame = Frame(self.parent, width=300, height=50, background="green")
self.green_frame.grid(row=1, column=0)
def show_blue_frame(self):
self.green_frame.grid_remove()
self.blue_frame.grid()
def show_green_frame(self):
self.green_frame.grid()
self.blue_frame.grid_remove()
def on_mode_changed(self, event):
selected_mode = self.mode_selector.get()
if selected_mode == 'blue':
self.show_blue_frame()
elif selected_mode == 'green':
self.show_green_frame()
root = Tk()
App(root)
root.mainloop()
这使用grid_remove()
和grid()
来隐藏和显示元素。
但是现在如果我在蓝框上添加一个按钮(取消注释上面build_blue_frame
方法中的按钮行),grid_remove
似乎会丢失所有帧信息,如高度和颜色,如这个gif。
Isn&#39; t grid_remove
是否应该记住高度,背景颜色等所有配置,即使在按钮添加到框架后也是如此?
答案 0 :(得分:1)
即使将一个按钮添加到框架中,isn&lt; grid_remove是否应该记住高度,背景颜色等所有配置?
没有。 grid_remove
仅记住grid
了解的数据(row
,column
,sticky
等)。它不记得有关正被删除的小部件属性的任何信息。
您看到的行为是tkinter的设计方式。如果一个小部件有子节点,它会增长或缩小以尽可能地适合孩子。当您将按钮添加到蓝框时,并且因为您没有将蓝框配置为&#34;坚持&#34;在它所处空间的边缘,蓝色框架将缩小以适合按钮。
作为一般规则,使用sticky
时,您应该几乎总是提供grid
值。您还应该至少为一行和一列weight
(grid_rowconfigure
和grid_columnconfigure
),这样孩子们就会占用额外的空间。