Lomonos1917
@Lomonos1917
Делаю IRE для предприятия с нуля.

Как синхронизировать БД sqlite и виджет tkinter ttk.treeview?

Имеется приложение на tkinter. Оно представляет собой окно, на котором нас интересует виджет ttk.treeview. Этот виджет организован как таблица (то есть лишен дочерних строк). В эту таблицу подгружаются данные из БД cqlite3. Когда в базу добавляется новая строка, она не сразу подгружается в таблицу. Приходится закрывать окно и открывать его заново, чтобы всё подгрузилось и можно было работать с новыми строками. Мой вопрос: как сделать, чтобы данные в таблице обновлялись сразу после добавления в БД новой позиции?

Теперь к конкретике:
61e5d8dda335a568718040.png

Так выглядит окно приложения. Верхняя и нижняя таблица образованы одним классом:
class Table(Frame):
    def __init__(self, parent = None, headings = tuple(), rows = tuple(), Table_Data_Class = Table_Data()):
        super().__init__(parent)

        table = Treeview(self, show="headings", selectmode="browse")
        table["columns"] = headings
        table["displaycolumns"] = headings

        for head in headings:
            table.heading(head, text=head, anchor=CENTER)
            table.column(head, anchor=CENTER, width=20)

        for row in rows:
            table.insert('', END, values=tuple(row))

        table.bind("<ButtonRelease-1>", lambda event, tree = table: Table_Data_Class.getting_data(event, tree))

        scrolltable = Scrollbar(self, command=table.yview)
        scrolltable1 = Scrollbar(self, command= table.xview)
        table.configure(yscrollcommand=scrolltable.set)
        table.configure(xscrollcommand=scrolltable1.set)
        scrolltable.pack(side=RIGHT, fill=Y)
        scrolltable1.pack(side=BOTTOM, fill=X)
        table.pack(expand=YES, fill=BOTH)


Далее в коде они вызываются и переносятся на окно следующим образом:
data = (',')
    with sqlite3.connect('data.sqlite') as connection:
        cursor = connection.cursor()
        cursor.execute("SELECT * FROM active_application WHERE [Вид обслуживания] ='РЕМОНТ'")
        data = (row for row in cursor.fetchall())
    
    data1 = (',')
    with sqlite3.connect('data.sqlite') as connection:
        cursor = connection.cursor()
        cursor.execute("SELECT * FROM active_application WHERE [Вид обслуживания] = 'TO'")
        data1 = (row for row in cursor.fetchall())

    table = Table(root, headings=('Номер заявки', 'Дата заявки', 'Гаражный номер', 'Вид ТС', 'Модель ТС', 'Гос. рег. знак', 'ДЭУ', 'Вид обслуживания', 'Категория обслуживания', 'Описание неисправности'), rows=data, Table_Data_Class = Table_Data_Class)
    table.pack ( fill=BOTH, padx=150, pady=80)
    table1 = Table(root, headings=('Номер заявки', 'Дата заявки', 'Гаражный номер', 'Вид ТС', 'Модель ТС', 'Гос. рег. знак', 'ДЭУ', 'Вид обслуживания', 'Категория обслуживания'), rows=data1, Table_Data_Class = Table_Data_Class)
    table1.pack ( fill=BOTH,  padx=150, pady=60)


Примечание: "Table_Data_Class" - это класс, который позволяет мне по щелчку мыши выбирать первую позицию строчки таблицы ( то есть номер заявки)
  • Вопрос задан
  • 57 просмотров
Решения вопроса 1
Vindicar
@Vindicar
Питоновский модуль для sqlite этого не умеет, хотя sqlite сама по себе предоставляет update_hook. См stackoverflow.
Более простое решение - периодически опрашивать сервер, но это может быть напряжно.

Но с учетом твоего другого вопроса, PostgreSQL реализует синтаксис LISTEN/NOTIFY. Есть модули для питона, которые позволяют этим пользоваться. Периодический опрос всё ещё потребуется, но он будет потреблять куда меньше ресурсов, чем SELECT.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы