Кнопки прокручиваемого кадра tkinter изменяют размер с рамкой - PullRequest
0 голосов
/ 03 июня 2018

Я создал (с помощью) класс 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()

enter image description here

1 Ответ

0 голосов
/ 04 июня 2018

На самом деле ваши кнопки заполняют рамку.Когда вы даете различные цвета фона элементов, вы можете видеть это.Я сделал вашу внешнюю рамку красной, ваш холст - зеленой, а вашу рамку - синими кнопками:

Вы можете видеть, что на самом деле внутренняя рамка не заполняет холст,вместо того, чтобы ваши кнопки не заполняли рамку.

Чтобы рамка заполнила холст, как объяснено в ответе на этот вопрос , вы можете сделать привязку к холсту <Configure>событие для растягивания рамки до размера холста, если холст больше минимального размера кнопок.Для этого необходимо сохранить идентификатор помещенного фрейма на холсте:

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).

...