Мой холст не позволяет мне прокручивать питон

Я создавал менеджер YouTube для личного пользования, и все шло неплохо, пока я не столкнулся с кирпичной стеной с пользовательским интерфейсом.

Вот код:

class Application(ttk.Frame):
def __init__(self, master=None):
    super().__init__(master)
    self.pack()
    self.create_widgets()

def create_widgets(self):
    nb = ttk.Notebook(self)

    page1 = ttk.Frame(nb, width= 300)
    #page1 = ttk.Frame(self, width= 300)

    nb.add(page1, text='One')
    #page1.grid()

    nb.grid()

    frames = {}
    labels = {}
    lk_btns = {}
    cmt_btns = {}
    mk_wch_btns = {}
    dwld_btns = {}

    i = 0

    scrollbar = ttk.Scrollbar(page1)
    #scrollbar.grid(row = 0,column = 1,sticky = "ns")
    scrollbar.pack(side = "right",fill = "y")

    listbox = tk.Canvas(page1,yscrollcommand = scrollbar.set,)

    #listbox.grid(row = 0,column = 0,sticky = "nsew")
    listbox.pack(side = "left",fill = "both")

    for v in test.getLatestVids():
        frm = ttk.Frame(listbox)
        frm.grid(row=i, column=1,sticky = "E")

        lb = ttk.Label(frm, text=convert65536(v["snippet"]["title"]))
        lb.grid(row = 0,rowspan = 4,column=0,sticky = "E")
        labels[i] = lb

        download = ttk.Button(frm, text="Download")
        download.grid(row = 1,column=1,sticky = "W")
        dwld_btns[i] = download

        mwatched = ttk.Button(frm, text="Mark Watched")
        mwatched.grid(row = 2,column=1,sticky = "W")
        mk_wch_btns[i] = mwatched

        like = ttk.Button(frm, text="Like")
        like.grid(row = 1,column=2,sticky = "W")
        lk_btns[i] = like

        comment = ttk.Button(frm, text="Comment")
        comment.grid(row = 2,column=2,sticky = "W")
        cmt_btns[i] = comment

        frames[i] = frm
        i += 1

    scrollbar.config(command=listbox.yview)
    listbox.configure(scrollregion=(-400, -400, 400, 400))

    #self.quit = tk.Button(self, text="QUIT", fg="red",
    #                      command=root.destroy)

root = tk.Tk()
app = Application(master=root)
app.mainloop()

PS1: метод «convert65536» — это метод обработки смайликов в заголовках YouTube. Я нашел его здесь.

PS2: Метод «test.getLatestVids» — это созданный мной внешний метод, который возвращает список словарей.

Проблема здесь в том, что код считает, что места много, и вместо этого не использует полосу прокрутки. Я попытался сделать эту работу, ограничив размер «страницы 1», но мне это не удалось.

Вот несколько скриншотов:

В полноэкранном режиме

Просмотр всего списка благодаря нескольким рабочим столам


person Ogz Kdgl    schedule 24.08.2017    source источник


Ответы (1)


Элементы, добавленные на холст с помощью pack, place или grid, не будут прокручиваться. Единственное, что будет прокручиваться на холсте, — это окна, добавленные с помощью create_window.

Наиболее распространенным решением является добавление одного кадра на холст, а затем pack, place или grid виджетов внутри кадра. См. http://stackoverflow.com/a/3092341/7432.

Если вы создаете вертикальный список текста и виджетов, еще более простым решением является использование текстового виджета, который позволяет встраивать виджеты с помощью метода window_create.

person Bryan Oakley    schedule 24.08.2017