【问题标题】:tkinter Scrolled Frame Buttons Resize with Frametkinter 滚动框架按钮随框架调整大小
【发布时间】:2018-06-03 10:55:55
【问题描述】:

我(在帮助下)创建了一个带有滚动条的 Frame 类。似乎效果很好,但我希望按钮的大小适合框架的大小。现在,如果您看,它们都聚集在左侧。我浏览了很多例子,这似乎很常见。下面包含一些易于运行的代码,因此您可以看到问题。下面附上问题的图片。

谢谢。

from tkinter import *


class ScrolledFrame(Frame):
    def __init__(self, top, *args, **kwargs):
        Frame.__init__(self, top, *args, **kwargs)

        hscrollbar = Scrollbar(self, orient=HORIZONTAL)
        hscrollbar.grid(row=1, column=0, sticky=E+W)

        vscrollbar = Scrollbar(self, orient=VERTICAL)
        vscrollbar.grid(row=0, column=1, sticky=N+S)

        self.canvas = Canvas(self, xscrollcommand=hscrollbar.set, yscrollcommand=vscrollbar.set)
        self.canvas.grid(row=0, column=0, sticky=N+S+E+W)

        hscrollbar.config(command = self.canvas.xview)
        vscrollbar.config(command = self.canvas.yview)

        # Make the canvas expandable
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

        # Create the canvas contents
        self.frame = Frame(self.canvas)
        self.frame.rowconfigure(1, weight=1)
        self.frame.columnconfigure(1, weight=1)

        self.canvas.create_window(0, 0, window=self.frame, anchor=N+W)
        self.canvas.config(scrollregion=self.canvas.bbox('all'))

        self.frame.bind('<Configure>', self.frame_changed)

    def frame_changed(self, event):
        self.frame.update_idletasks()
        self.canvas.config(scrollregion=self.canvas.bbox('all'))


root = Tk()
frame = ScrolledFrame(root)
frame.grid(row=0, column=0, sticky=N+E+W+S)
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)

for i in range(20):
    button = Button(frame.frame, text='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx %d' % i)
    button.pack(fill=BOTH, side=TOP, expand=True)

root.mainloop()

【问题讨论】:

    标签: python tkinter positioning


    【解决方案1】:

    实际上,您的按钮正在填充框架。当您为不同的元素提供背景颜色时,您可以看到这一点。我已将您的外框设为红色,将画布设为绿色,将按钮设为蓝色:

    你可以看到实际上是内部框架没有填满画布,而不是你的按钮没有填满框架。

    要使框架填充画布,如this question 的回答中所述,如果画布大于最小尺寸,您可以在画布&lt;Configure&gt; 事件上进行绑定以将框架拉伸到画布大小的按钮。为此,您必须将放置的框架的 id 保存在画布上:

    self.canvas_frame = self.canvas.create_window(0, 0, window=self.frame, anchor=N+W)
    self.canvas.bind('<Configure>', self.canvas_changed)
    
    def canvas_changed(self, event):
        if self.frame.winfo_reqwidth() < self.canvas.winfo_width():
            self.canvas.itemconfigure(self.canvas_frame, width=self.canvas.winfo_width())
    

    为确保在不需要时没有水平滚动条,您可能需要稍微减小框架的宽度 (width=self.canvas.winfo_width()-4)。

    【讨论】:

    • 非常感谢,很好的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-09
    • 1970-01-01
    相关资源
    最近更新 更多