Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Полосы прокрутки на холсте в Tkinter

Автор вопроса: user926914Ответов: 1

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

        #make new window
        self.edit_window = Tkinter.Toplevel()
        self.edit_window.title("Data Refinement")
        self.edit_window.maxsize(height='50', width='300')

        #make scrollbar for canvas
        cScrollbar = Tkinter.Scrollbar(self.edit_window)
        cScrollbar.pack(side=Tkconstants.RIGHT, fill=Tkconstants.Y)

        #make canvas
        canvas = Tkinter.Canvas(self.edit_window)

        #attach canvas to scrollbar
        canvas.config(yscrollcommand=cScrollbar.set)
        cScrollbar.config(command=canvas.yview)

        #make frame and put everything in frame
        frame = Tkinter.Frame(self.edit_window)

        #random fill
        Tkinter.Label(frame, text="Enter bounds for the parameters").pack()
        Tkinter.Label(frame, text="Enter bounds for the parameters").pack()
        Tkinter.Label(frame, text="Enter bounds for the parameters").pack()
        Tkinter.Label(frame, text="Enter bounds for the parameters").pack()
        Tkinter.Label(frame, text="Enter bounds for the parameters").pack()
        Tkinter.Label(frame, text="Enter bounds for the parameters").pack()

        #scrollbar for listbox
        scrollbar = Tkinter.Scrollbar(frame)
        scrollbar.pack(side=Tkconstants.RIGHT, fill=Tkconstants.Y)

        listbox = Tkinter.Listbox(frame)
        listbox.pack()

        #insert some random data for now into listbox
        for i in range(100):
            listbox.insert(Tkconstants.END, i)

        # attach listbox to scrollbar
        listbox.config(yscrollcommand=scrollbar.set)
        scrollbar.config(command=listbox.yview)

        #pack and attach to canvas
        frame.pack(fill=Tkconstants.BOTH, expand=Tkconstants.YES)
        canvas.create_window(0,0, anchor = Tkconstants.NW, window = frame)

        canvas.pack(fill=Tkconstants.BOTH, expand=Tkconstants.YES)
        canvas.config(scrollregion=canvas.bbox(Tkconstants.ALL))

Так что рамка удачно сделана с содержимым. И рама удачно крепится к полотну. Чего я не понимаю, так это того, что полоса прокрутки, прикрепленная к списку, работает, а полоса, подключенная к холсту, отображается, но на самом деле не работает. Полоса прокрутки действует так, как будто все уже отображено. Это похоже на то, что он прокручивает то, что видно, а не прокручивает все содержимое холста.

  • Кто-нибудь понимает, почему то, как я это делаю, работает для списка, но не для холста? Я продолжаю применять примеры прокрутки холстов из Интернета, но у меня возникает та же проблема .... это так ужасно расстраивает user926914 21.01.2012

tkinter

Ответы

Ответ 1 · рейтинг 1 · Bryan Oakley

Я сейчас не за компьютером, чтобы проверить, но я предполагаю, что высота фрейма будет равна 1 до тех пор, пока виджет не будет сопоставлен, после чего он будет увеличиваться или уменьшаться, чтобы соответствовать его содержимому. Однако вы устанавливаете область прокрутки холста до того, как это произойдет, поэтому область прокрутки фактически равна нулю. Вы можете убедиться в этом, распечатав результат команды canvas.bbox(Tkconstants.ALL)

Попробуйте добавить вызов self.update_idletasks перед настройкой области прокрутки и посмотрите, исправит ли это проблему.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы