Python 画布中的框架将无法展开以适合画布

Python 画布中的框架将无法展开以适合画布,python,canvas,tkinter,Python,Canvas,Tkinter,我不知道这为什么行不通。我一定是遗漏了什么,因为我可以使单个框架展开以适合画布,但我不能使框架内的框架展开以适合画布 我已经为此奋斗了几个小时,我觉得这很明显 我希望NoteFrame内部的标签展开以填充框架,而该NoteFrame展开以填充画布 以下是复制行为代码的最低代码: import tkinter as tk class NoteFrame(tk.Frame): def __init__(self, container): super().__init__(

我不知道这为什么行不通。我一定是遗漏了什么,因为我可以使单个框架展开以适合画布,但我不能使框架内的框架展开以适合画布

我已经为此奋斗了几个小时,我觉得这很明显

我希望
NoteFrame
内部的标签展开以填充框架,而该NoteFrame展开以填充画布

以下是复制行为代码的最低代码:

import tkinter as tk


class NoteFrame(tk.Frame):
    def __init__(self, container):
        super().__init__(container)
        self.config(background='white')
        for i in range(20):
            tk.Label(self, text='test').grid(row=i, column=0, sticky='nsew')


class GCMain(tk.Tk):
    def __init__(self):
        super().__init__()
        self.columnconfigure(0, weight=1)
        self.rowconfigure(0, weight=1)

        self.main_canvas = tk.Canvas(self, background="bisque")
        self.main_canvas.columnconfigure(0, weight=1)
        self.main_canvas.rowconfigure(0, weight=1)
        self.frame_n_canvas = tk.Frame(self.main_canvas)
        self.frame_n_canvas.grid(row=0, column=0, sticky='nsew') # tried with and without this
        self.frame_n_canvas.columnconfigure(0, weight=1)
        self.main_canvas.config(scrollregion=self.main_canvas.bbox("all"), highlightthickness=0)
        scrollbar = tk.Scrollbar(self, orient='vertical')
        scrollbar.grid(row=0, column=1, sticky='nsw')
        scrollbar.config(command=self.main_canvas.yview)
        self.main_canvas.config(yscrollcommand=scrollbar.set)
        self.main_canvas.grid(row=0, column=0, sticky='nsew')
        self.main_canvas.create_window(0, 0, window=self.frame_n_canvas, anchor='nw')
        self.main_canvas.bind("<Configure>", self.update_scrollregion)

        nf = NoteFrame(self.frame_n_canvas)
        nf.grid(row=0, column=0, sticky='nsew') # tried with and without this

    def on_resize(self, event):
        w, h = event.width, event.height
        self.main_canvas.configure(width=w, height=h)
        self.frame_n_canvas(width=w, height=h) # tried with and without this

    def update_scrollregion(self, event):
        self.main_canvas.configure(scrollregion=self.main_canvas.bbox("all"))


if __name__ == '__main__':
    GCMain().mainloop()
将tkinter作为tk导入
类记事本(tk.Frame):
定义初始化(自身,容器):
super().\uuuu init\uuuu(容器)
self.config(background='white')
对于范围(20)内的i:
tk.Label(self,text='test').grid(row=i,column=0,sticky='nsew'))
GCMain类(tk.tk):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.columnconfigure(0,权重=1)
self.rowconfigure(0,权重=1)
self.main_canvas=tk.canvas(self,background=“bisque”)
self.main\u canvas.columnconfigure(0,权重=1)
self.main\u canvas.rowconfigure(0,权重=1)
self.frame\u n\u canvas=tk.frame(self.main\u canvas)
self.frame_n_canvas.grid(row=0,column=0,sticky='nsew')#尝试使用和不使用此选项
self.frame\n\u canvas.columnconfigure(0,权重=1)
self.main_canvas.config(scrollregion=self.main_canvas.bbox(“全部”),highlightthickness=0)
scrollbar=tk.scrollbar(self,orient='vertical')
scrollbar.grid(行=0,列=1,sticky='nsw')
scrollbar.config(命令=self.main\u canvas.yview)
self.main_canvas.config(yscrollcommand=scrollbar.set)
self.main_canvas.grid(行=0,列=0,sticky='nsew')
self.main\u canvas.create\u window(0,0,window=self.frame\u n\u canvas,anchor='nw')
self.main\u canvas.bind(“,self.update\u scrollregion)
nf=记事本(自帧画布)
nf.grid(row=0,column=0,sticky='nsew')#尝试使用和不使用此选项
def on_resize(自我,事件):
w、 h=事件宽度,事件高度
self.main_canvas.configure(宽度=w,高度=h)
self.frame_n_canvas(宽度=w,高度=h)#使用和不使用此选项都进行了尝试
def update_滚动区域(自身、事件):
self.main\u canvas.configure(scrollregion=self.main\u canvas.bbox(“全部”))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
GCMain().mainloop()
注释:动态解决方案

  • 允许您的
    标签
    sticky='ew'
    使用
    .grid\u column配置(0,权重=1)

  • 您需要
    Canvas(…,window=
    对象的
    iid

    需要参数
    宽度=200,高度=200

    self.main_canvas.fram_n_canvas_iid =\
            self.main_canvas.create_window(0, 0, window=self.frame_n_canvas, anchor='nw')
    
  • 绑定到已知的

    self.main_canvas.bind("<Configure>", self.canvas_configure)
    

  • 问题:画布中的框架无法展开以适合画布

    一个小部件,这里是你的框架
    self.Frame\n\u画布
    ,如果与
    一起放置,将失去
    展开
    的能力。在
    画布中创建窗口(…

    这个,
    .grid(…
    )是无用的,因为您稍后将使用
    放置相同的
    框架

    self.frame_n_canvas.grid(row=0, column=0, sticky='nsew') # tried with and without this
    ...
    self.main_canvas.create_window(0, 0, window=self.frame_n_canvas, anchor='nw')
    
    class NoteFrame(tk.Frame):
        def __init__(self, container):
            super().__init__(container)
            self.grid_columnconfigure(0, weight=1)
    
    要为您的
    记事本提供展开的位置,请使用参数
    width=200,height=200

    self.main_canvas.create_window(0, 0, window=self.frame_n_canvas, anchor='nw',
                                   width=200, height=200)
    
    要使您的
    标签
    成为
    sticky='ew'
    ,您必须执行
    .grid\u column配置(…
    ):

    self.frame_n_canvas.grid(row=0, column=0, sticky='nsew') # tried with and without this
    ...
    self.main_canvas.create_window(0, 0, window=self.frame_n_canvas, anchor='nw')
    
    class NoteFrame(tk.Frame):
        def __init__(self, container):
            super().__init__(container)
            self.grid_columnconfigure(0, weight=1)
    
    结果

    注释:动态解决方案

  • 允许您的
    标签
    sticky='ew'
    使用
    .grid\u column配置(0,权重=1)

  • 您需要
    Canvas(…,window=
    对象的
    iid

    需要参数
    宽度=200,高度=200

    self.main_canvas.fram_n_canvas_iid =\
            self.main_canvas.create_window(0, 0, window=self.frame_n_canvas, anchor='nw')
    
  • 绑定到已知的

    self.main_canvas.bind("<Configure>", self.canvas_configure)
    

  • 问题:画布中的框架无法展开以适合画布

    一个小部件,这里是你的框架
    self.Frame\n\u画布
    ,如果与
    一起放置,将失去
    展开
    的能力。在
    画布中创建窗口(…

    这个,
    .grid(…
    )是无用的,因为您稍后将使用
    放置相同的
    框架

    self.frame_n_canvas.grid(row=0, column=0, sticky='nsew') # tried with and without this
    ...
    self.main_canvas.create_window(0, 0, window=self.frame_n_canvas, anchor='nw')
    
    class NoteFrame(tk.Frame):
        def __init__(self, container):
            super().__init__(container)
            self.grid_columnconfigure(0, weight=1)
    
    要为您的
    记事本提供展开的位置,请使用参数
    width=200,height=200

    self.main_canvas.create_window(0, 0, window=self.frame_n_canvas, anchor='nw',
                                   width=200, height=200)
    
    要使您的
    标签
    成为
    sticky='ew'
    ,您必须执行
    .grid\u column配置(…
    ):

    self.frame_n_canvas.grid(row=0, column=0, sticky='nsew') # tried with and without this
    ...
    self.main_canvas.create_window(0, 0, window=self.frame_n_canvas, anchor='nw')
    
    class NoteFrame(tk.Frame):
        def __init__(self, container):
            super().__init__(container)
            self.grid_columnconfigure(0, weight=1)
    
    结果

    Hey stovfl。感谢您的帖子,但我仍然无法使用画布调整框架的大小。向“创建窗口”选项添加宽度和高度会扩展框架,但由于某些原因,我以后无法调整宽度/高度。我尝试直接使用框架和canvas.itemconfig定义宽度/高度。知道为什么使用frame没有扩展到完全填满画布?@Mike SMT:更新了我的答案,显示了我只添加
    的结果。创建窗口(…,宽度=200,高度=200)
    self.grid\u列配置(0,重量=1)
    添加到您的问题代码。请确认这是否是您想要的,或者解释原因。我还需要框架向右侧展开。填充整个画布。我已经添加了更多问题,因为很难在MCVE中解释问题。如果您有更多问题,请告诉我。“填充整个画布”:例如,我的固定值
    =200
    仅用于显示
    标签粘性
    正在工作。我假设您需要动态解决方案,因此您必须获得
    .main\u canvas
    的大小,并调整
    项的大小
    .main\u canvas.create\u窗口(…
    因此。嘿,stovfl。感谢您的帖子,但我仍然无法使用画布调整框架的大小。向“创建窗口”选项添加宽度和高度会扩展框架,但由于某些原因,我无法调整框架的大小