Как применить полосу прокрутки к рамке на холсте - PullRequest
2 голосов
/ 16 сентября 2011

Мне очень тяжело пытаться добиться четкой компоновки графического интерфейса в tkinter. Я нацеливаюсь на макет слева, но не продвинулся дальше, чем макет справа:

enter image description here enter image description here

Я чувствую себя совершенно потерянным во всех этих разных менеджерах компоновки. Это мой код:

from Tkinter import *

class ScrolledCanvas:
    def __init__(self, master, width=500, height=350):
        Label(master, text="top of master frame").pack(side=TOP)
        self.control=Frame(master)
        self.control.pack(side=BOTTOM, fill=X, padx=2)
        Label(self.control, text="bottom of master frame").pack()
        self.grid = Frame(master, bd=2, bg="red")
        self.canvas = Canvas(master, relief=SUNKEN, borderwidth=2, 
                             scrollregion=('-11c', '-11c', '50c', '20c')) 
        self.vscroll = Scrollbar(master, command=self.canvas.yview) 
        self.canvas.configure(yscrollcommand=self.vscroll.set) 

        self.grid.pack(expand=YES, fill=BOTH, padx=1, pady=1)
        self.grid.rowconfigure(0, weight=1, minsize=0)
        self.grid.columnconfigure(0, weight=1, minsize=0)

        self.canvas.grid(padx=1, in_=self.grid, pady=1, row=0,
                         column=0, rowspan=1, columnspan=1, sticky='news')
        self.vscroll.grid(padx=1, in_=self.grid, pady=1, row=0,
                          column=1, rowspan=1, columnspan=1, sticky='news')
        self.oldFill = None
        self.canvas = self.fillCanvas(self.canvas)

    def fillCanvas(self, theCanvas):
        for i in range(10):
            frame = Frame(theCanvas)
            Label(frame, text="text for inner frame (%s)" % i).pack(side=TOP)
            Button(frame, text="button %s.1" % i).pack(side=LEFT)
            Button(frame, text="button %s.2" % i).pack(side=LEFT)
            frame.pack()
        return theCanvas

if __name__ == '__main__':
    root = Tk()
    scroll = ScrolledCanvas(root)
    root.mainloop()

По какой-то причине область прокрутки расширяется до полного размера, что делает все действия полосы прокрутки устаревшими (этот код основан на примере полосы прокрутки, где холст заполнен некоторыми прямоугольниками, и все прокручивается действительно хорошо). Вероятно, я упустил что-то принципиальное из изменения размера, потому что большинство компонентов, похоже, полностью игнорируют их фиксированную ширину и высоту.

Я ищу справку о том, как заставить этот пример работать с tkinter. Я знаю, что существуют другие технологии макета, и я знаю, что другие модули предлагают прокручиваемые виджеты из коробки. Но если это не является неизбежным, я действительно хотел бы придерживаться этого примера, который стоил мне как минимум 3 ночи ...

1 Ответ

4 голосов
/ 16 сентября 2011

Вы не можете упаковать (или сетку, или разместить) виджеты на холст и ожидать их прокрутки. Вместо этого вы должны использовать метод create_window .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...