Tkinter resizablecanvas class 不会调整所有小部件的大小并且出现故障。 canvas 继续增长

Tkinter resizablecanvas class does not resize all the widgets and it is malfunctioning. The canvas keeps on growing

Tkinter resizablecanvas class 没有调整所有小部件的大小并且出现故障。 canvas 继续增长。 Canvas 的大小不断增加。我想要实现的是,当我最大化 window 时,我需要调整所有小部件的大小。我的代码如下

from tkinter import *
from tkinter import ttk

class ResizingCanvas(Canvas):
    def __init__(self,parent,**kwargs):
        Canvas.__init__(self,parent,**kwargs)
        self.bind("<Configure>", self.resize)
        self.height = self.winfo_reqheight()
        self.width = self.winfo_reqwidth()

    def resize(self,event):
        wscale = float(event.width)/self.width
        hscale = float(event.height)/self.height
        self.width = event.width
        self.height = event.height
        self.config(width=self.width, height=self.height)
        self.scale("all",0,0,wscale,hscale)
        print (self.width, self.height)


class Test(Frame):
    def Widgets(self):
        self.tabcontrol = ttk.Notebook(self)

        self.mainframe = Frame(self)
        self.tabcontrol.add(self.mainframe, text = "TAB-1")
        self.tabcontrol.pack(fill= "both", expand = YES)

        self.canvasframe = Frame(self.mainframe)
        self.canvasframe.grid(row=0, column = 0)

        self.canvas = ResizingCanvas(self.canvasframe)
        self.canvas.grid(row=0, column = 0)

        self.widgetframe = Frame(self.canvasframe)
        self.canvas.create_window(100,100, window = self.widgetframe)

        self.LABEL = Label(self.widgetframe, text = "LABEL-1")
        self.LABEL.grid(row=1, column= 1)

        self.BUTTON = Button(self.widgetframe, text = "BUTTON-1")
        self.BUTTON.grid(row=1, column= 2)

        self.widgetframe.update_idletasks()


    def __init__(self,initial):
        super(Test, self).__init__(initial)
        self.grid()
        self.Widgets()


root = Tk()
Software = Test(root)
root.mainloop()

有人可以帮助我吗?谢谢!

如果我理解您的要求,您想要的是 canvas 填充 window,即使 window 调整大小时也是如此。如果您使用正确的 gridpackplace 选项,Tkinter 可以自动执行此操作。

您选择使用多层帧,并使用 grid 而不是 pack,这让这变得非常困难。如果您只将一个小部件放入另一个小部件(根 [=38= 中的选项卡控件、canvas 框架中的 canvas 等),请使用 pack 而不是 grid 将需要更少的代码行。

以下代码说明了我将如何重写您的代码以消除一些额外的框架,并强制笔记本选项卡和 canvas 随根 window 自动增长。我还为 canvas 添加了一种颜色,以便更容易可视化。

注意在将 self 添加到根 window 以及将 canvas 添加到框架时使用 pack 而不是 grid。如果愿意,您可以使用 grid,但它还要求您将行和列配置为具有非零权重。这很容易做到,但是当您有如此简单的布局时,grid 需要三行代码,pack 需要一行代码。

from tkinter import *
from tkinter import ttk

class Test(Frame):
    def Widgets(self):
        self.tabcontrol = ttk.Notebook(self)

        self.mainframe = Frame(self)
        self.tabcontrol.add(self.mainframe, text = "TAB-1")
        self.tabcontrol.pack(fill= "both", expand = YES)

        self.canvas = Canvas(self.mainframe, background="bisque")
        self.canvas.pack(fill="both", expand=True)

        self.widgetframe = Frame(self.canvas)
        self.canvas.create_window(100,100, window = self.widgetframe)

        self.LABEL = Label(self.widgetframe, text = "LABEL-1")
        self.LABEL.grid(row=1, column= 1)

        self.BUTTON = Button(self.widgetframe, text = "BUTTON-1")
        self.BUTTON.grid(row=1, column= 2)        

    def __init__(self,initial):
        super(Test, self).__init__(initial)
        self.pack(fill="both", expand=True)
        self.Widgets()


root = Tk()
Software = Test(root)
root.mainloop()