网格删除遗忘配置

时间:2017-10-30 09:20:12

标签: tkinter

这是一个Tkinter程序,有两种模式可供选择。选择“蓝色”'显示蓝框并选择“绿色”。显示绿框。

enter image description here

执行此操作的代码:

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。

enter image description here

Isn&#39; t grid_remove是否应该记住高度,背景颜色等所有配置,即使在按钮添加到框架后也是如此?

1 个答案:

答案 0 :(得分:1)

  

即使将一个按钮添加到框架中,isn&lt; grid_remove是否应该记住高度,背景颜色等所有配置?

没有。 grid_remove仅记住grid了解的数据(rowcolumnsticky等)。它不记得有关正被删除的小部件属性的任何信息。

您看到的行为是tkinter的设计方式。如果一个小部件有子节点,它会增长或缩小以尽可能地适合孩子。当您将按钮添加到蓝框时,并且因为您没有将蓝框配置为&#34;坚持&#34;在它所处空间的边缘,蓝色框架将缩小以适合按钮。

作为一般规则,使用sticky时,您应该几乎总是提供grid值。您还应该至少为一行和一列weightgrid_rowconfiguregrid_columnconfigure),这样孩子们就会占用额外的空间。