#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. Почему голосование по вопросу?