Ttk笔记本过多的框架会导致故障

问题描述

我正在Tkinter / Ttk中创建一个简单的sqlite数据库查看器。它由一个ttk笔记本组成,每个选项卡中都有一个表格。对于较小的表,它可以很好地加载,但对于具有1000多个行的表,它会出现毛刺。
它的外观:

Working layout


大桌子上的外观:

Not working


(顶部的白色部分覆盖了其他窗口,有点奇怪)
是否有更好的方式加载表,以免发生这种情况?
代码

import tkinter as tk
import tkinter.filedialog
from tkinter import ttk
import random

class dbTable(tk.Frame):
    def __init__(self,*args,**kwargs):
        tk.Frame.__init__(self,**kwargs)
    def populateTable(self,data):
        for n1,line in enumerate(data):
            if n1 == 0: #Header
                bg = "lightgray"
            else:
                bg = "white"
            for n2,item in enumerate(line):
                f = tk.Frame(self,highlightthickness = 1,highlightbackground = "black",bg = bg)
                f.grid(row = n1,column = n2,sticky = "nesw")
                l = tk.Label(f,bg = bg,text = item)
                l.pack(padx = 3,pady = 3,fill = "both",expand = True)
        if len(data) == 1:
            f = tk.Label(self,text = "No data")
            f.grid(row = 2,column = 0,columnspan = len(data[0]))
class DatabaseViewer(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.title("Database viewer")
        self.loadData()
        self.openViewer()
    def loadData(self):
        self.tables = ["example"]
        self.tableHeaders = {"example":("header1","header2","header3","header4")}
        randData = [(n,random.randint(10,20000000),20000000)) for n in range(1000)]
        self.tableData = {"example":randData}
    def openViewer(self):
        self.viewerFrm = tk.Frame(self)
        self.viewerFrm.pack()
        self.viewerNotebook = ttk.Notebook(self.viewerFrm)
        self.viewerNotebook.pack()
        for table in self.tables:
            f = tkinter.Frame(self.viewerNotebook)
            self.viewerNotebook.add(f,text = table)
            t = dbTable(f)
            t.pack(fill = "both",expand = True)
            t.populateTable([self.tableHeaders[table]] + self.tableData[table])

app = DatabaseViewer()
app.mainloop()

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)