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