tkinter 标签框架及其小部件未调整大小

问题描述 投票:0回答:1

我正在创建一个自定义 tkinter 类 ResizableLabelFrame(),它有一个标签框架和一个用于容纳小部件的内部框架。调整窗口大小时,小部件不会调整大小。有人能指出我解决这个问题的正确方向吗?提前致谢。 大多数时候,我只需阅读 Stack Overflow 上发布的问题和答案就可以解决问题,并且在您的帮助下我的学习进步了很多。非常感谢。
full window reduced window

我尝试了列配置(0,权重=1),行配置(0,权重=1) 我想创建一个自定义标签框架类,它可以调整其内部框架和小部件的大小

from tkinter import *
class ResizableLabelFrame(LabelFrame):
    def __init__(self, master=None, **kwargs):
        LabelFrame.__init__(self, master, **kwargs)

        # Set default weight for resizing
        self.columnconfigure(0, weight=1)
        self.rowconfigure(0, weight=1)

        # Bind the resizing function to the label frame
        self.bind("<Configure>", self.on_resize)

        # Create a frame inside the LabelFrame to hold widgets
        self.inner_frame = Frame(self)
        self.inner_frame.grid(row=0, column=0, sticky="nsew")
        self.inner_frame.columnconfigure(0, weight=1)
        self.inner_frame.rowconfigure(0, weight=1)
        resizable_frame_inner_frame_columns = self.inner_frame.grid_size()[0] 
        print(resizable_frame_inner_frame_columns)
        """
        for i in range(resizable_frame_inner_frame_columns):
            resizable_frame.columnconfigure(i, weight=1)
        """
    def on_resize(self, event):
        # Get the new size of the label frame
        width = event.width
        height = event.height
        print(width,"X",height)

        # Resize the inner frame to match the label frame's size
        self.inner_frame.config(width=width, height=height)

        # Resize widgets inside the inner frame if needed
        for widget in self.inner_frame.winfo_children():
            self.resize_widget(widget)

    def resize_widget(self, widget):
        # Resize the widget if it has a resize method
        if hasattr(widget, "resize"):
            widget.resize()

    def add_widget(self, widget, position):
        # Add a widget to the inner frame
        widget.grid(row=0, column=position, padx=10, pady=10, sticky="nsew")


if __name__ == "__main__":
    root = Tk()
    root.geometry("500x100")

    # Create an instance of ResizableLabelFrame
    resizable_frame = ResizableLabelFrame(root, text="Controls")
    resizable_frame.grid(row=0, column=0, sticky="nsew")

    # Add widgets to the resizable frame
    label = Label(resizable_frame.inner_frame, text="Enter TOTP")
    entry = Entry(resizable_frame.inner_frame)
    button = Button(resizable_frame.inner_frame, text="Connect")
    
    resizable_frame.add_widget(label, 0)
    resizable_frame.add_widget(entry, 1)
    resizable_frame.add_widget(button, 2)
    resizable_frame_columns = resizable_frame.grid_size()[0] 
    print(resizable_frame_columns)
    
    # Example of a widget with a custom resize method
    class CustomResizableWidget(Label):
        def resize(self):
            # Custom resizing logic for the widget
            pass

    custom_widget = CustomResizableWidget(resizable_frame.inner_frame, text="Connection Status")
    resizable_frame.add_widget(custom_widget, 3)

    root.mainloop()

python tkinter window-resize
1个回答
0
投票

当我使用时

root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)

然后调整元素大小。

可能你用错地方了。

© www.soinside.com 2019 - 2024. All rights reserved.