使用 layout_manager 网格动态调整滚动条 Canvas 的大小

Resizing Canvas with Scrollbar dynamically by using the layout_manager grid

我建了一个 canvas 但我不知道为什么,我不会让它随框架调整大小。 要么是缺少了一些明显的东西,要么是我失去了理智,要么是发生了一些奇怪的事情,但我不明白。无论如何,这是我的代码,希望它能被澄清。

import tkinter as tk

root = tk.Tk()

class my_figure(tk.Frame):
    def __init__(self, master,
                 width=450,height=590):
        tk.Frame.__init__(self, master)
        self.master = master
        self.width=width
        self.bind("<Configure>", self.update)

        #DownFrame
        self.body = tk.Frame(self, width=width,height=height,relief='sunken',bd=2)
        self.vscrbar = tk.Scrollbar(self.body)
        self.hscrbar = tk.Scrollbar(self.body,orient=tk.HORIZONTAL)
        self.Display = tk.Canvas(self.body, width=width,height=height,
                                 background='#f0f0f0',highlightthickness=0,
                                 yscrollcommand=self.vscrbar.set,
                                 xscrollcommand=self.hscrbar.set)
        
        self.vscrbar.config(command=self.Display.yview)
        self.hscrbar.config(command=self.Display.xview)

        self.body.grid(column=0,row=1, sticky='nswe')
        self.vscrbar.grid(column=1,sticky='ns')
        self.hscrbar.grid(row=1,sticky='we')
        self.Display.grid(column=0,row=0,
                          sticky='nswe')

        
        self.grid_rowconfigure(1, weight=1)
        self.columnconfigure(0, weight=1)

    def update(self, event):
        print(event.widget.winfo_width())
##        self.Header.config(width=event.width)
##        self.Button.config(width=event.width)
##        self.body.config(width=event.width)
##        self.Display.config(width=event.width)
        

        
figure = my_figure(root)
figure.grid(column=0, row=0)
root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(0,weight=1)

root.mainloop()

您使用了嵌套父级 container.Your my_figure 是一个继承自 Frame 的小部件。并且您的 my_figure 中还有一个 Frame 小部件。您需要为它们设置 columnconfigurerowconfigure

还需要为您的 figure 使用 sticky="nwes"

虽然可以正常工作,packmanager是最好的选择。

代码:

import tkinter as tk

root = tk.Tk()


class my_figure(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.master = master
        # self["bd"] = 10
        self.bind("<Configure>", self.update)

        # DownFrame
        self.body = tk.Frame(self, relief='sunken')
        for i in range(self.body.grid_size()[1] + 1):
            self.body.grid_rowconfigure(i, weight=1)

        for i in range(self.body.grid_size()[0] + 1):
            self.body.grid_columnconfigure(i, weight=1)

        for i in range(self.grid_size()[1] + 1):
            self.grid_rowconfigure(i, weight=1)

        for i in range(self.grid_size()[0] + 1):
            self.grid_columnconfigure(i, weight=1)

        self.vscrbar = tk.Scrollbar(self.body)
        self.hscrbar = tk.Scrollbar(self.body, orient=tk.HORIZONTAL)
        self.Display = tk.Canvas(self.body,
                                 background='#f0f0f0', highlightthickness=0,
                                 yscrollcommand=self.vscrbar.set,
                                 xscrollcommand=self.hscrbar.set)

        self.vscrbar.config(command=self.Display.yview)
        self.hscrbar.config(command=self.Display.xview)

        self.body.grid(column=0, row=0, sticky='nswe')
        self.vscrbar.grid(row=0, column=1, sticky='ns')
        self.hscrbar.grid(row=1, column=0, sticky='we')
        self.Display.grid(column=0, row=0,
                          sticky='nswe')

    def update(self, event):
        print(event.widget.winfo_width())


##        self.Header.config(width=event.width)
##        self.Button.config(width=event.width)
##        self.body.config(width=event.width)
##        self.Display.config(width=event.width)


figure = my_figure(root)
figure.grid(column=0, row=0, sticky="nwes")
root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(0,weight=1)

root.mainloop()