Отобразить базу данных в окне tkinter

Мне необходимо отобразить мою базу данных в окне tkinter

попробовала с помощью следующего кода

import sqlite3
import pymysql.cursors
import tkinter  as tk
from tkinter import *
my_conn =  pymysql.connect(host='localhost',
                             user='root',
                             password='almaopt',
                             db='sklad',
                             charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)
###### end of connection ####

##### tkinter window ######

my_w = tk.Tk()
my_w.geometry("400x250")

with my_conn.cursor() as cursor:
    sql = ('''SELECT * from mom LIMIT 0,10''')
    cursor.execute(sql)
    i = 0  # row value inside the loop
    for mom in cursor:
        for j in range(len(mom)):
            e = Entry(my_w, width=10, fg='blue')
            e.grid(row=i, column=j)
            e.insert(END, mom[j])
        i = i + 1


cursor.close()
my_w.mainloop()

но выдает ошибку Traceback (most recent call last): File "dp.py", line 26, in e.insert(END, mom[j]) KeyError: 0

Пробовала еще вот таким способом

from tkinter import *
from tkinter import ttk
import tkinter as tk
import tkinter.ttk as ttk
import pymysql.cursors
import sqlite3
 
#connection database 'sklad'
connection = pymysql.connect(host='localhost',
                             user='root',
                             password='almaopt',
                             db='sklad',
                             charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)
 
#function for button
def click_button():
    with connection.cursor() as cursor:
        # SQL
        sql = "SELECT ID, Nomination, Boarcode, Quantity, Price FROM mom "
 
        # Выполнить команду запроса (Execute Query).
        cursor.execute(sql)
 
        print("cursor.description: ", cursor.description)
 
        print()
 
        for row in cursor:
            print(row)
    cursor.close ()
 
#decription desktop window
window = Tk()
window.title("Склад Альма Опт")
window.geometry ('2000x1000')
 
#declaring tabs
 
#active tab1
#add and describe table on tab1
 
 
#describe button on tab1
btn = Button(window, text="Загрузить базу данных", command=click_button)
btn.place(x=10, y=50)
btn.pack()
 
 
#grafics window output
window.mainloop()

Здесь осуществляется полноценный вывод базы данных, но я не понимаю как его перенести в графическое окно


Ответы (1 шт):

Автор решения: insolor

Судя по ошибке, mom - это словарь (KeyError происходит при попытке получении значения по несуществующему ключу из словаря), а код у вас как для получения значений из списка.

Чтобы выводило значения из словаря, нужно перебирать ключи из mom (насколько я понимаю, каждый ключ - это имя колонки результата запроса), по каждому ключу выводить значение в текстовое поле:

i = 0  # row value inside the loop
for mom in cursor:
    j = 0
    for key in mom:
        e = Entry(my_w, width=10, fg='blue')
        e.grid(row=i, column=j)
        e.insert(END, mom[key])
        j = j + 1
    i = i + 1

Можно упростить код с помощью enumerate:

for i, mom in enumerate(cursor):
    for j, key in enumerate(mom):
        e = Entry(my_w, width=10, fg='blue')
        e.grid(row=i, column=j)
        e.insert(END, mom[key])

Также теоретически в словарях ключи могут приходить в разном порядке, поэтому желательно их либо сортировать (for j, key in enumerate(sorted(mom)): ...), либо завести список с нужными ключами (именами колонок), и по ним получать данные, примерно так:

columns = ['ID', 'Nomination', ...]  # имена колонок заменить на нужные
for i, mom in enumerate(cursor):
    for j, key in enumerate(columns):
        e = Entry(my_w, width=10, fg='blue')
        e.grid(row=i, column=j)
        e.insert(END, mom[key])
→ Ссылка