Python - XY-прокрутка фрейма Tkinter не эффективно загружает виджеты - PullRequest
0 голосов
/ 17 марта 2019

У меня есть текущий код (вырезанный из оригинала) - этот фрагмент также доступен здесь .

import tkinter as tk
import tkinter.ttk as ttk
class ScrolledFrame(tk.Frame):
    def __init__(self, master, **kw):
        tk.Frame.__init__(self, master, **kw)
        vsb = tk.Scrollbar(self, orient='vertical')
        vsb.grid(column=1, row=0, sticky='ns')
        hsb = tk.Scrollbar(self, orient='horizontal')
        hsb.grid(column=0, row=1, sticky='ew')

        self.canvas = canvas = tk.Canvas(self, bd=0, highlightthickness=0,
                        yscrollcommand=vsb.set, xscrollcommand=hsb.set)
        canvas.grid(row=0, column=0, sticky='nsew')
        #canvas.configure(scrollregion=canvas.bbox('all'))
        vsb.config(command=canvas.yview)
        hsb.config(command=canvas.xview)
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

        # reset the view
        canvas.xview_moveto(0)
        canvas.yview_moveto(0)

        self.interior = interior = tk.Frame(canvas)
        interior_id = canvas.create_window(0, 0, window=interior,
                                           anchor='nw')

        def _configure_interior(event):
            size = (interior.winfo_reqwidth(), interior.winfo_reqheight())
            canvas.config(scrollregion="0 0 %s %s" % size)
            if interior.winfo_reqwidth() != canvas.winfo_width():
                canvas.config(width=interior.winfo_reqwidth())
        interior.bind('<Configure>', _configure_interior)

        def _configure_canvas(event):
            if interior.winfo_reqwidth() != canvas.winfo_width():
                canvas.itemconfigure(interior_id, width=canvas.winfo_width())
        canvas.bind('<Configure>', _configure_canvas)

if __name__ == '__main__':
    root = tk.Tk()
    main_frame = ScrolledFrame(root)
    main_frame.grid(row=0, column=0, sticky='nsew')
    root.grid_rowconfigure(0, weight=1)
    root.grid_columnconfigure(0, weight=1)
    for i in range(100): tk.Button(main_frame.interior, text=f'test {i}').grid(row=0, column=i)
    root.geometry('360x240')
    root.mainloop()

Цель кода также состоит в том, чтобы иметь рамку с возможностью прокрутки по осям x и y; однако возникает проблема, при которой прокрутка по оси x приводит к тому, что элементы не отображаются: Example of it not working

Однако, по-видимому, ось у работает отлично - я пытался изменить программой с другими настройками scrollregion= (т.е. 'all'), но пока не получилось, кажется, что полностью удаляет функциональность оси X .

1 Ответ

1 голос
/ 17 марта 2019

Вы явно устанавливаете ширину внутренней рамки равной ширине холста.Например, при запуске программы холст будет иметь ширину чуть меньше 360 пикселей, поэтому вы устанавливаете внутреннюю рамку на этот размер.На моей машине это 309 пикселей.Таким образом, когда вы прокручиваете, вы сможете увидеть только кнопки на 309 пикселей.

Весь смысл прокрутки в том, что вы пытаетесь увидеть нечто большее, чем окно, но вызаново искусственно сделав внутреннюю рамку того же размера, что и окно.

Вы должны прекратить принудительно устанавливать внутренний каркас того же размера, что и холст, или по крайней мере прекратить принудительно устанавливать меньше .чем холст.Это должно быть его естественный размер.

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