【问题标题】:Grid remove forgetting configuration网格移除遗忘配置
【发布时间】:2017-10-30 09:20:12
【问题描述】:

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

执行此操作的代码:

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 中可以看到的高度和颜色。

难道grid_remove 不应该记住所有配置,如高度、背景颜色等,即使在将按钮添加到框架之后也是如此?

【问题讨论】:

    标签: tkinter


    【解决方案1】:

    难道 grid_remove 不应该记住所有的配置,比如高度、背景颜色等,即使在一个按钮被添加到框架之后?

    没有。 grid_remove 只记住 grid 知道的数据(rowcolumnsticky 等)。它不记得任何关于被删除的小部件的属性。

    您看到的行为是 tkinter 的设计方式。如果一个小部件有孩子,它会尽可能地增长或缩小以适应孩子。当您将按钮添加到蓝框时,并且由于您没有将蓝框配置为“粘”到它所在空间的边缘,蓝框将缩小以适合按钮。

    作为一般规则,在使用grid 时,您几乎应该总是给出sticky 值。您还应该给至少一行和一列weight(以及grid_rowconfiguregrid_columnconfigure),这样孩子们就可以使用额外的空间。

    【讨论】:

    • 谢谢..在研究weight 时,我偶然发现了grid_propagate(False)。这与sticky 相结合似乎成功了。
    • @tao:关闭传播几乎总是错误的解决方案。保持打开状态可以让您的 UI 更能响应分辨率、窗口大小、字体和平台的变化。
    • OK 将改为尝试权重。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多