Tkinter положил полосу прокрутки на холсте в нижней позиции

Вопрос о позициях полосы прокрутки на моем холсте tkinter. У меня есть рамка с 3 виджетами холста. Предоставлено этот пост за идею. Я добавил горизонтальную полосу прокрутки, и у каждого холста есть более 50 столбцов и более 500 строк данных. Нагрузка не очень быстрая, но это не цель.

Новые строки будут добавлены в конец каждого кадра данных. Эта новая строка нуждается в проверке. Таким образом, вместо прокрутки вниз каждый раз, было бы здорово, если бы полоса прокрутки / или холст показывала нижнюю часть.

Ниже приведен код, в котором определены 3x холст и 3x полосы прокрутки (x+y).

def createBox(window):
    list_ = ['df1', 'df2', 'df3'] # 3 dataframes

    for i in range(3):
            mybox = LabelFrame(window, padx=5, pady=4)
            mybox.grid(row=i, column=0)
            createWindow(mybox, list_[i], i)

def createWindow(box, lt_actual, i):
    canvas = Canvas(box, borderwidth=0)
    frame = Frame(canvas)
            vsbY = Scrollbar(box, orient="vertical", command=canvas.yview)
            canvas.configure(yscrollcommand=vsbY.set, width=1200, heigh=200) 
            vsbY.pack(side="right", fill="y")

            vsbX = Scrollbar(box, orient="horizontal", command=canvas.xview)
            canvas.configure(xscrollcommand=vsbX.set, width=1200, heigh=200)       
            vsbX.pack(side="bottom", fill="x")

    #canvas.yview_moveto(1) - no effect
    #canvas.yview_moveto(1.0) - no effect

    canvas.pack(side="left", fill="both", expand=True)
    canvas.create_window((4,4), window=frame, anchor="nw", tags="frame")

    # be sure that we call OnFrameConfigure on the right canvas
    frame.bind("<Configure>", lambda event, canvas=canvas: OnFrameConfigure(canvas))

Я читал на этом форуме и на некоторых страницах информации (effbot), что я должен использовать опцию команды moveto() / yview_moveto(), но пока это не работает.

Вопрос 1. Должен ли я поместить y-полосу прокрутки внизу или я должен поставить вид холста внизу.

Вопрос 2. Можете ли вы дать некоторые рекомендации о том, как использовать moveto, или я должен следовать другому подходу?

Спасибо!

1 ответ

Решение

yview_moveto Метод canvas - действительно правильная функция для использования. Его аргумент - это часть общей высоты холста, которую вы хотите за кадром. Таким образом, использование 0 в качестве аргумента показывает верхнюю часть холста, а 1 - нижнюю.

import tkinter as tk

root = tk.Tk()

canvas = tk.Canvas(root)
canvas.grid(row=0, column=0)
canvas.create_oval(0, 0, 20, 20, fill='red')
canvas.create_oval(0, 800, 20, 820, fill='blue')

ys = tk.Scrollbar(root, orient='vertical', command=canvas.yview)
ys.grid(row=0, column=1, sticky='ns')
# configure scrolling
canvas.configure(yscrollcommand=ys.set, scrollregion=canvas.bbox('all'))
# show bottom of canvas
canvas.yview_moveto(1)

root.mainloop()

Между прочим, я не вижу никакой разницы между положением y-прокрутки внизу и отображением холста внизу, потому что они связаны. Но я догадался, что вы хотите знать, делать ли это с помощью метода полосы прокрутки или холста, и я дал ответ выше.

Я обнаружил, что перед перемещением вкладки прокрутки необходимо использовать idle_tasks:

    self.canvas.update_idletasks()
    self.canvas.yview_moveto(0)
Другие вопросы по тегам