【问题标题】:How make tkinter grid_forget resize LabelFrame?如何让 tkinter grid_forget 调整 LabelFrame 的大小?
【发布时间】:2023-02-23 05:39:21
【问题描述】:

我有一个包含按钮的框架,它被打包在一个带有网格几何管理器的 LabelFrame 中。
当我用 grid_forget 删除这个框架时,LabelFrame 仍然具有相同的大小。
换句话说 它不会缩小。

这是代码,当您按下按钮时,所有按钮都将被删除 但大小仍然存在。
我希望网格几何管理器在删除小部件时自动处理调整大小。

import tkinter as tk

class Collapsible():
    def __init__(self, master):
        self.master = master        
        self.dynamic_widgets()
        self.fill_lb()
        
    def dynamic_widgets(self):
        """create widgets"""
        #frame that holds labelwidgets
        self.fr_collapse = tk.Frame(self.master, bg="orange")
        
        #title for label frame----------------------------------------------------------------
        self.bt_title = tk.Button(self.fr_collapse, text="o", 
                                  highlightthickness = 0, bd = 0, 
                                  relief="flat", bg="orange", fg="red")
        self.bt_title.grid(row=0, column=0)
        self.label_title = tk.Label(self.fr_collapse, text="Name", bg="orange")
        self.label_title.grid(row=0, column=1)
        #-------------------------------------------------------------------------------------
        
        self.label_frame = tk.LabelFrame(self.master,  
                                              bg="orange", labelwidget=self.fr_collapse)
        self.label_frame.grid(sticky="wesn", ipady=(10))  
        
        #frame for buttons
        self.frame_forget = tk.Frame(self.label_frame, bg="orange")
        self.frame_forget.grid()
        
        #set command
        self.bt_title.configure(command=lambda x=self.frame_forget, y=self.bt_title: self.hide(x, y))
        
    def fill_lb(self):
        "fill label frame with dumb buttons"""
        b = tk.Button(self.frame_forget, text="Example button 1", bg="orange", relief="flat")
        b.grid()
        b2 = tk.Button(self.frame_forget, text="Example button 2", bg="orange", relief="flat")
        b2.grid()
        
    def hide(self, frame, button):        
        """switch value: hide frame based on text configuration"""
        bt_text  = button.configure("text")
        if bt_text[-1] == "o":
            frame.grid_remove()
            button.configure(text="-")
        else:
            frame.grid()
            button.configure(text="o")

if __name__ == "__main__":
    root = tk.Tk() 
    col = Collapsible(root)
    root.configure(bg="orange")
    root.mainloop()  
  • 到目前为止我尝试了什么:
    • 我想也许我需要在删除按钮后将其网格化。行不通,因为这会 再次将我的隐藏按钮网格化,这在逻辑上是合乎逻辑的。
    • 我想也许我需要再次对 LableFrame 进行网格化。尺寸也没有变化
    • 我认为也许我应该放置一个像占位符一样具有最小宽度和高度值的哑框。 并将它作为我的 frame_forget 框架中的孩子网格化,希望它会缩小。但还是一无所获。

这些想法都没有给我带来解决方案,问题仍然存在

当我运行我的脚本时,它看起来像这样:

然后当我按下左下角“o”的平面按钮时,我得到了这个:

我希望它像这样崩溃:

【问题讨论】:

  • 如何重现运行您问题中的代码的问题?
  • 当。。。的时候最后一项删除容器的大小,容器将不会调整其大小。可以在self.frame_forget前加一个高度为1的Frame

标签: python tkinter


【解决方案1】:

只需在第46行,self.label_frame参数中添加widthheight即可。 代码:

if bt_text[-1] == "o":
    frame.grid_remove()
    self.label_frame.configure(height=20, width=150) #  <--- line 46

截屏:

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    相关资源
    最近更新 更多