条目外的较大 tkinter 表变得非常慢

Larger tkinter table out of Entrys becoming very slow

提问人:Patrick T. 提问时间:11/15/2023 更新时间:11/15/2023 访问量:47

问:

我想在一种表格中显示数据,可在 y 上滚动并在 x 方向上调整大小。 为了在单个单元格中显示文本,我使用条目小部件。 我想用一条细线将 x 和 y 方向上的单元格分开 我想要在细胞中另外一个框架,我可以染色

它应该看起来像我下面的代码。 问题是,随着数据的增加,窗口变得非常慢 (窗口移动,窗口大小调整) 滚动功能非常不流畅 (使用鼠标滚轮比移动滚动条更好一点)

有没有办法让它更流畅,或者 Python / tkinter 只是错误的工具? 为什么 Excel 可以如此轻松地处理大表?

import tkinter as tk

root = tk.Tk()
root.geometry("600x350")

canvas = tk.Canvas(root)
scrollbar = tk.Scrollbar(root, command=canvas.yview)
canvas.configure(yscrollcommand=scrollbar.set)

scrollbar.pack(side="right", fill="y")
canvas.pack(fill="both", expand=True)

frame = tk.Frame(root, bg="black")
canvas.create_window(0, 0, anchor="nw", window=frame, tags=("inner_frame",))

frame.columnconfigure(1, weight=1)
frame.columnconfigure((0,1,2,3,4,5,6,7,8,9), minsize=40)

innerborders = []
c = 0
for i in range(150):
    for j in range(10):

        innerborders.append(tk.Frame(frame, bg="white"))
        innerborders[c].grid(column=j, row=i, sticky="nesw", padx=(0, 1), pady=(0, 1))

        entry = tk.Entry(innerborders[c],width=1, disabledbackground="white", disabledforeground="black", borderwidth=0)
        entry.insert(0, "Entry")
        entry["state"]="disabled"
        entry.pack(padx=2, pady=2, fill="both")

        c+=1

innerborders[11]["bg"] = "red"
innerborders[32]["bg"] = "green"
innerborders[34]["bg"] = "yellow"
innerborders[41]["bg"] = "blue"

def canvas_resize(event):
    border = int(canvas.cget("borderwidth"))
    event.widget.itemconfigure("inner_frame", width=event.width-border*2)

def frame_resize(event):
    canvas.configure(scrollregion=canvas.bbox("all"))

def _on_mousewheel(event):
    if not scrollbar.get()[0] == 0.0 or not scrollbar.get()[1] == 1.0:
        canvas.yview_scroll(int(-1 * (event.delta / 60)), "units")

canvas.bind("<Configure>", canvas_resize)
frame.bind("<Configure>", frame_resize)
frame.bind_all("<MouseWheel>", _on_mousewheel)

root.mainloop()
python excel tkinter 滚动条

评论


答: 暂无答案