Полосы прокрутки на холсте в Tkinter - PullRequest
0 голосов
/ 20 января 2012

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

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

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

1 Ответ

1 голос
/ 21 января 2012

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

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

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