Python 3.x 用网格显示大表格
我试图用网格显示一个270行70列的表格 它显然太大了,无法在一次拍摄中全部显示出来。 如果我将行数限制为50,则需要12秒,当然,随着我的增加,需要更多的时间,然后在某个点上,它会变得不稳定。 是否需要先设置20行的标签数据,然后显示,然后设置下一个20行的标签数据,将这些数据添加到显示中,依此类推Python 3.x 用网格显示大表格,python-3.x,tkinter,Python 3.x,Tkinter,我试图用网格显示一个270行70列的表格 它显然太大了,无法在一次拍摄中全部显示出来。 如果我将行数限制为50,则需要12秒,当然,随着我的增加,需要更多的时间,然后在某个点上,它会变得不稳定。 是否需要先设置20行的标签数据,然后显示,然后设置下一个20行的标签数据,将这些数据添加到显示中,依此类推 def populate_using_tkinter(frame, project_list): current_row_number = 0; # Columns *****
def populate_using_tkinter(frame, project_list):
current_row_number = 0;
# Columns ********************************************************************************************************
label_id_column = Tkinter.Label(frame, text=Constants.PROJECT_COLUMN_TITLE_Id, borderwidth=GRID_BORDER_WIDTH, relief="solid", background=row_header_color)
<more columns>
label_ContractorID_column = Tkinter.Label(frame,text = Constants.PROJECT_COLUMN_TITLE_ContractorID, borderwidth = GRID_BORDER_WIDTH,relief = "solid")
label_id_column.grid(row=current_row_number, column=Constants.PROJECT_ID_COLUMN, sticky="nsew")
<more columns>
label_ContractorID_column.grid(row=current_row_number, column=Constants.PROJECT_ContractorID_COLUMN, sticky="nsew")
current_row_number +=1
frame.rowconfigure(current_row_number, minsize=row_height, weight=0)
for project in project_list:
project_id = project[0]
<more assignments>
project_ContractorID = project[70]
# Data ********************************************************************************************************
try:
label_project_id = Tkinter.Label(frame, text=project_id, borderwidth=GRID_BORDER_WIDTH, relief="solid", background=row_color)
<more data>
label_project_ContractorID=Tkinter.Label(frame,text=projectContractorID,anchor="w",borderwidth=GRID_BORDER_WIDTH,relief="solid", background=row_color)
label_project_id.grid(row=current_row_number, column=Constants.PROJECT_ID_COLUMN, sticky="nsew")
<more data>
label_project_ContractorID.grid(row=current_row_number, column=Constants.PROJECT_ContractorID_COLUMN, sticky="nsew")
except IndexError:
print ("[ERROR] IndexError: " + str(current_row_number) )
current_row_number +=1
def main():
project_list = <get from database> # 270 x 70
root = Tkinter.Tk()
canvas = Tkinter.Canvas(root, borderwidth=0, background="#ffffff")
frame = Tkinter.Frame(canvas, background="#ffffff")
canvas.pack(side="left", fill="both", expand=True)
canvas.create_window((4,4), window=frame, anchor="nw")
frame.bind("<Configure>", lambda event, canvas=canvas: onFrameConfigure(canvas))
populate_using_tkinter(frame, project_list)
root.geometry("1000x600")
root.mainloop()
这听起来更适合treeview小部件。但是,如果要使用标签表,一种方法是使用生成器与after方法相结合: 或者你可以把它放在树视图里。通常我觉得这更容易显示数据,它还附带了许多方便的方法,允许您排序、导出等。我还添加了一个垂直和水平滚动条供参考
from tkinter import ttk
import tkinter as tk
root = tk.Tk()
class TreeFrame(tk.Frame):
def __init__(self,master,**kwargs):
tk.Frame.__init__(self,master,**kwargs)
self.tree = ttk.Treeview(self, selectmode='extended', height=24)
self.tree.grid(row=0,column=0,sticky="nsew")
vsb = ttk.Scrollbar(self, orient="vertical",command=self.tree.yview)
vsb.grid(row=0,column=1,sticky="ns")
hsb = ttk.Scrollbar(self, orient="horizontal",command=self.tree.xview)
hsb.grid(row=1,column=0,sticky="ew")
self.tree.configure(yscrollcommand=vsb.set)
self.tree.configure(xscrollcommand=hsb.set)
header = [i for i in range(70)]
self.tree["columns"] = header
self.tree['show'] = 'headings'
self.start = 0
for i in range(len(header)):
self.tree.column(header[i], width=15, minwidth=27, anchor="w")
self.tree.heading(header[i], text=header[i], anchor='w')
def dummy_data(self):
for i in range(self.start, self.start+20):
current = self.tree.insert("","end",values=[i for _ in range(70)])
self.tree.see(current)
self.start += 20
if self.start >= 270:
return
else:
root.after(1000,self.dummy_data)
tree_frame = TreeFrame(root)
tree_frame.pack()
tk.Button(root,text="Add dummy data",command=tree_frame.dummy_data).pack()
root.mainloop()
谢谢你的回复。我不必使用标签表。从表面上看,treeview听起来并不合适,因为我的数据中没有“分支”。你认为treeview会更快吗?你可以在没有分支的情况下插入数据。理论上,它应该比创建270x70标签小部件更快。我已经添加了一个片段来创建280x70虚拟数据插入到treeview中。HenryYik:我让treeview工作了。它确实快得多。
from tkinter import ttk
import tkinter as tk
root = tk.Tk()
class TreeFrame(tk.Frame):
def __init__(self,master,**kwargs):
tk.Frame.__init__(self,master,**kwargs)
self.tree = ttk.Treeview(self, selectmode='extended', height=24)
self.tree.grid(row=0,column=0,sticky="nsew")
vsb = ttk.Scrollbar(self, orient="vertical",command=self.tree.yview)
vsb.grid(row=0,column=1,sticky="ns")
hsb = ttk.Scrollbar(self, orient="horizontal",command=self.tree.xview)
hsb.grid(row=1,column=0,sticky="ew")
self.tree.configure(yscrollcommand=vsb.set)
self.tree.configure(xscrollcommand=hsb.set)
header = [i for i in range(70)]
self.tree["columns"] = header
self.tree['show'] = 'headings'
self.start = 0
for i in range(len(header)):
self.tree.column(header[i], width=15, minwidth=27, anchor="w")
self.tree.heading(header[i], text=header[i], anchor='w')
def dummy_data(self):
for i in range(self.start, self.start+20):
current = self.tree.insert("","end",values=[i for _ in range(70)])
self.tree.see(current)
self.start += 20
if self.start >= 270:
return
else:
root.after(1000,self.dummy_data)
tree_frame = TreeFrame(root)
tree_frame.pack()
tk.Button(root,text="Add dummy data",command=tree_frame.dummy_data).pack()
root.mainloop()