【问题标题】:How do I make tkinter frame fill entire canvas and expand together with it?如何使 tkinter 框架填充整个画布并与其一起扩展?
【发布时间】:2020-01-04 17:25:26
【问题描述】:

我想制作一个可滚动的框架来填充应用程序窗口中的整个单元格。调整窗口大小时,框架中的小部件应保持居中。由于框架不可滚动,我使用了画布并在其窗口中放置了一个框架。滚动区域与框架相关联。但是我不能使框架扩展并填充整个画布区域。

我尝试在画布中为具有整个画布宽度的框架创建一个窗口,并将窗口宽度的变化与画布配置事件相关联。但是我得到了一个有线结果。框架仅占据窗口的右侧部分。当我展开窗口时,它会向左移动。我将画布涂成黄色,将框架涂成绿色,以使事物可见。 感谢您的帮助!

import tkinter as tk


class FrameWithScrollBar(tk.Frame):

    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        self.canvas = tk.Canvas(self, bg='yellow')
        self.frame = tk.Frame(self.canvas, bg='green')
        self.scrollbar = tk.Scrollbar(self, orient='vertical',
                                command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=self.scrollbar.set)
        self.canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        self.scrollbar.pack(side=tk.RIGHT, fill=tk.BOTH)
        self.frame.pack(fill=tk.BOTH, expand=True)
        self._frame_id = self.canvas.create_window(
                                 self.canvas.winfo_reqwidth(), 0,
                                 anchor='n',
                                 window=self.frame)
        self.frame.bind('<Configure>', self.onFrameConfigure)
        self.canvas.bind('<Configure>', self.onCanvasConfigure)

    def onFrameConfigure(self, event):       
        self.canvas.configure(scrollregion=self.frame.bbox('all'))

    def onCanvasConfigure(self, event):
        width = event.width
        self.canvas.itemconfigure(self._frame_id, width=width)


if __name__ == '__main__':

    root = tk.Tk()
    fws = FrameWithScrollBar(root)
    buttons = list()
    for i in range(5):
        for j in range(25):
            button = tk.Button(fws.frame, text='Button ' + str(i) + ','+str(j))
            button.grid(row=j, column=i, sticky='wesn')
            tk.Grid.columnconfigure(fws.frame, j, weight=1)
    fws.pack(expand=True, fill=tk.BOTH)
    root.mainloop()

【问题讨论】:

  • 画布就像一个几何管理器,因此Frame 失去了使用.columnconfigure(fws.frame, j, weight=1) 的能力。在此j 旁边是行,列是i

标签: python tkinter tkinter-canvas tkinter-layout


【解决方案1】:

谢谢,stovfl! 工作代码以防有人需要它


import tkinter as tk


class FrameWithScrollBar(tk.Frame):

    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        self.canvas = tk.Canvas(self, bg='yellow')
        self.frame = tk.Frame(self.canvas, bg='green')
        self.scrollbar = tk.Scrollbar(self, orient='vertical',
                                command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=self.scrollbar.set)
        self.canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        self.scrollbar.pack(side=tk.RIGHT, fill=tk.BOTH)
        self.frame.pack(fill=tk.BOTH, expand=True)
        self._frame_id = self.canvas.create_window(
                                 self.canvas.winfo_width(), 0,
                                 anchor='nw',
                                 window=self.frame)
        self.frame.bind('<Configure>', self.onFrameConfigure)
        self.canvas.bind('<Configure>', self.onCanvasConfigure)

    def onFrameConfigure(self, event):       
        self.canvas.configure(scrollregion=self.frame.bbox('all'))

    def onCanvasConfigure(self, event):
        width = event.width
        self.canvas.itemconfigure(self._frame_id, width=self.canvas.winfo_width())


if __name__ == '__main__':

    root = tk.Tk()
    fws = FrameWithScrollBar(root)
    buttons = list()
    for i in range(5):
        for j in range(25):
            button = tk.Button(fws.frame, text='Button ' + str(i) + ','+str(j))
            button.grid(row=j, column=i, sticky='wesn')
            tk.Grid.columnconfigure(fws.frame, i, weight=1)
    fws.pack(expand=True, fill=tk.BOTH)
    root.mainloop()

【讨论】:

  • 请接受您的回答,以便其他用户知道该问题已得到满意回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-18
  • 2015-06-01
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
相关资源
最近更新 更多