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

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

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

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


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


Ответы (1)


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

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

person Bryan Oakley    schedule 21.01.2012
comment
Круто, вот и все, вызов self.edit_window.update_idletasks() исправил ситуацию. - person user926914; 21.01.2012