Большая таблица tkinter из записей становится очень медленнойPython

Программы на Python
Ответить
Anonymous
 Большая таблица tkinter из записей становится очень медленной

Сообщение Anonymous »

Я хочу отображать данные в виде таблицы с возможностью прокрутки по оси 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("", canvas_resize)
frame.bind("", frame_resize)
frame.bind_all("", _on_mousewheel)

root.mainloop()


Подробнее здесь: https://stackoverflow.com/questions/774 ... -very-slow
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»