Tkinter scrollbar инициализирует прокрутку вниз

#python #tkinter

#python #tkinter

Вопрос:

В Tkinter я создал, Frame который отображает кучу данных из pandas DataFrame . Чтобы поместиться в пространстве, которое у меня есть в моем реальном приложении, мне нужен Scrollbar . В приведенном ниже MRE я создаю некоторые заголовки, которые я не хочу перемещать, а затем основные данные, которые должны перемещаться вместе с полосой прокрутки. Это почти работает. Единственная проблема заключается в том, что полоса прокрутки по какой-то причине инициализируется в нижней части набора данных. Я долгое время работал с Tkinter, и такого никогда не случалось.

Я попытался использовать can.yview_moveto(0) и поместил эту строку в несколько разных мест в последовательности циклов, но, похоже, это ничего не дает.

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

 import pandas as pd
import numpy as np
from tkinter import *
from tkinter import ttk

class TestClass(Frame):
    def __init__(self, parent=None):
        self.parent = parent
        Frame.__init__(self)
        self.main = self.master
        
        df = pd.DataFrame(np.random.randn(50, 5), 
                            columns=['A', 'B', 'C', 'D', 'E'])
        
        mf = Frame(self.parent)
        mf.pack()
        scroll = Scrollbar(mf, orient='vertical')
        scroll.pack(side='right', fill='y')
        can=Canvas(mf, yscrollcommand=scroll.set)
        can.pack(side='bottom', fill='both', expand=True)
        scroll.config(command=can.yview)
        qfrm = Frame(can)
        lfrm = Frame(mf) 
        lfrm.pack(side='top', fill='both', expand=True)
        can.create_window((0,0), window=qfrm, anchor='w')
        qfrm.bind('<Configure>', 
                lambda event, canvas=can: self.onFrameConfigure(canvas))
        (Label(lfrm, text='Title of the Frame')
                .grid(column=0, row=0, columnspan=5, pady=5))
        c=0
        w=6
        for d in df.columns:
            r=0
            #Inserts headers
            Label(lfrm, text=d, width=w).grid(column=c, row=1)
            for i in df.index:
                #Inserts data
                (Label(qfrm, text=round(df.loc[i, d], 2), width=w)
                        .grid(row=r, column=c, sticky=EW))
                r =1
        
            c =1
        can.yview_moveto(0)
        

    def onFrameConfigure(self, canvas):
        #Fixes scrollbar on tkinter canvas
        canvas.configure(scrollregion=canvas.bbox("all"))

if __name__ == '__main__':
    root=Tk()
    ui = TestClass(root)
    ui.pack()
    root.mainloop()
  

Комментарии:

1. Пожалуйста, удалите тег Pandas

2. Почему голосование по вопросу?