【问题标题】:tkinter - resizing empty frametkinter - 调整空框架的大小
【发布时间】:2019-03-18 11:07:29
【问题描述】:

如何强制框架获取 window_height 0?

我的问题出现的一般情况:

import Tkinter as Tk

class App(Tk.Frame):
    def __init__(self, master):
        Tk.Frame(self, master)
        self.place_holder = Tk.Frame(master=self)
        self.content = Tk.Frame(master=self)

        self.place_holder.pack()
        self.content.pack(side=Tk.RIGHT)

        Tk.Button(master=self,command=self.add_something).pack(side=Tk.TOP)
        self.to_destroy = []

    def add_something(self):
        foo = Tk.button(master=self.place_holder, command=self.destroy_last)
        self.too_destroy.append(foo)

    def destroy_last(self):
        self.to_destroy[-1].destroy()

问题:

当我向place_holder 添加更多元素时,它会很好地重新缩放。

当我从place_holder 中删除元素时,它会很好地重新缩放。 EXCEPT 当我删除最后一个元素时。

在我添加任何内容之前,即使我添加了place_holder.pack(),它也不会显示。但是在删除最后一个元素后,place_holder 将保持最后一个元素的大小。有没有办法再次隐藏place_holder,直到我再次添加内容?

示例图片

左下角的空容器不包含任何元素,但仍然有最后一个元素的大小,我怎样才能让它消失而不删除它(我希望它再次在同一个地方)?

【问题讨论】:

  • @stovfl 使用pack_forget()pack() 时,框架/小部件将重新定位,就像您pack()'ed 一个新框架一样。它不像 grid_remove 那样记住位置。
  • 我要解决的真正问题是使用 pack() 在另一个框架之前获取一个框架。与此同时,我发现 PanedWindow 的 before 选项存在。此选项是否也适用于 pack() ? (这将消除 place_holder 存在的需要)
  • @miThom: "在另一个帧之前获取一个帧":当您想将它们全部放在您想要的位置时,Grid Geometry Manager 使用起来特别方便。
  • @stovfl 我记得 grid 和 pack/pack_forget 有同样的问题。空单元格在删除其中的最后一个元素后保持其大小。但我不确定我在那个单元格中是否有一个空框架......可能值得再次测试
  • @miThom: "不确定我是否有一个空框架": 用print('children:{}'.format(self.place_holder.children))验证

标签: python python-2.7 tkinter


【解决方案1】:

发生的情况是,当您移除最后一个小部件时,pack 不再管理框架,因此它不负责设置框架大小。

最简单的解决方案是临时打包一个 1x1 像素的帧,这会导致占位符帧缩小。

没有办法制作一个零像素的帧,因此这种方法总是会为占位符生成一个高/宽的区域。如果您不想要那个像素,您可以在占位符上安装 call pack_forget 以将其从显示器中完全删除,然后使用 pack 和适当的选项在您放入某些内容时重新添加它。

例子:

def destroy_last(self):
    self.to_destroy.pop().destroy()
    if len(self.to_destroy) == 0:
        tmp = Tk.Frame(self.place_holder, width=1, height=1, borderwidth=0)
        tmp.pack()
        self.place_holder.update()
        tmp.destroy()

【讨论】:

  • 它将始终保持 1x1 像素的事实令人遗憾,我确实不希望这样。我错过了包管理器在销毁最后一个元素时不再可用的事实。这很好地解释了为什么不可能完全按照我的意愿去做。我改用另一种方法来完成我想要的。我对寻找相同目标的人的回答是:这是不可能的,但是您可以通过很多不同的方式完成相同的事情,所以不要陷入思维模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
相关资源
最近更新 更多