【问题标题】:Tkinter: How to get frame in canvas window to expand to the size of the canvas?Tkinter:如何让画布窗口中的框架扩展到画布的大小?
【发布时间】:2015-06-01 21:19:37
【问题描述】:

所以我一直在 tkinter 中使用画布小部件来创建一个充满标签的框架,该框架带有一个滚动条。一切都很好,只是框架只扩展到放置在其中的标签的大小 - 我希望框架扩展到父画布的大小。

如果我对画布中的框架使用 pack(expand = True)(我在下面的代码中已将其注释掉)但随后滚动条不起作用,则可以轻松完成此操作。

下面是适当的代码:

    ...
    self.canvas = Canvas(frame, bg = 'pink')
    self.canvas.pack(side = RIGHT, fill = BOTH, expand = True)

    self.mailbox_frame = Frame(self.canvas, bg = 'purple')

    self.canvas.create_window((0,0),window=self.mailbox_frame, anchor = NW)

    #self.mailbox_frame.pack(side = LEFT, fill = BOTH, expand = True)

    mail_scroll = Scrollbar(self.canvas, orient = "vertical",
        command = self.canvas.yview)
    mail_scroll.pack(side = RIGHT, fill = Y)

    self.canvas.config(yscrollcommand = mail_scroll.set)

    self.mailbox_frame.bind("<Configure>", self.OnFrameConfigure)


def OnFrameConfigure(self, event):
    self.canvas.configure(scrollregion=self.canvas.bbox("all"))

我还提供了带有彩色框架的图像,以便您了解我的意思。粉色区域是mailbox_frame需要填充的画布(可以看到右边的滚动条):

【问题讨论】:

    标签: python python-3.x tkinter tkinter-canvas


    【解决方案1】:

    仅供将来参考,以防其他人需要知道:

            frame = Frame(self.bottom_frame)
            frame.pack(side = LEFT, fill = BOTH, expand = True, padx = 10, pady = 10)
    
            self.canvas = Canvas(frame, bg = 'pink')
            self.canvas.pack(side = RIGHT, fill = BOTH, expand = True)
    
            self.mailbox_frame = Frame(self.canvas, bg = 'purple')
    
            self.canvas_frame = self.canvas.create_window((0,0),
                window=self.mailbox_frame, anchor = NW)
            #self.mailbox_frame.pack(side = LEFT, fill = BOTH, expand = True)
    
            mail_scroll = Scrollbar(self.canvas, orient = "vertical", 
                command = self.canvas.yview)
            mail_scroll.pack(side = RIGHT, fill = Y)
    
            self.canvas.config(yscrollcommand = mail_scroll.set)
    
            self.mailbox_frame.bind("<Configure>", self.OnFrameConfigure)
            self.canvas.bind('<Configure>', self.FrameWidth)
    
        def FrameWidth(self, event):
            canvas_width = event.width
            self.canvas.itemconfig(self.canvas_frame, width = canvas_width)
    
        def OnFrameConfigure(self, event):
            self.canvas.configure(scrollregion=self.canvas.bbox("all"))
    

    【讨论】:

    • 非常感谢!这一切都不同了。我猜设置从create_window返回的对象到self.canvas_frame是关键?
    • 你节省了我的时间!我知道画布大小没有更新,但经过多次实验后看不到右侧。谢谢!
    【解决方案2】:

    在画布上设置绑定&lt;Configure&gt; 事件,只要画布改变大小就会触发该事件。从事件对象中,您可以获得画布的宽度和高度,并使用它来调整框架的大小。

    【讨论】:

      猜你喜欢
      • 2017-04-08
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-14
      • 1970-01-01
      • 2018-02-04
      相关资源
      最近更新 更多