Найти - Пользователи
Полная версия: Обновление treeview после добавления данных в БД
Начало » Python для новичков » Обновление treeview после добавления данных в БД
1 2
Feelgood
rami
Да вот тут как-раз этот велосипед и получился.
По факту сама прога разрослась до функционала: Ссылка на GitHub.
Но если в самом начале я был слишком глуп и молод, то на текущий момент я стал менее глупее и чуть по-взрослее)
И теперь понимаю что архитектура данного приложения слишком отвратительная, и на сейчас мне слишком мозолит глаза следующие вещи:
1. Почти все запросы к БД описал не в классе DB, а раскиданы по другим классам
2. Повторяемость некоторых участков кода, а именно:
         [self.tree.delete(i) for i in self.tree.get_children()]
        [self.tree.insert('', 'end', values=row) for row in self.db.c.fetchall()]
Пытаясь исправить п.1 я попадаю на ошибку:
NameError: name ‘app’ is not defined
.
И я понимаю что я пытаюсь вызвать, что еще не определил, но исправить не могу, потому что натыкаюсь на следующую ошибку и так по кругу….
 if __name__ == "__main__":
    root = tk.Tk()
    db = DB()
    app = Main(root)
    app.pack()
rami
Feelgood
И теперь понимаю что архитектура данного приложения слишком отвратительная, и на сейчас мне слишком мозолит глаза следующие вещи:
1. Почти все запросы к БД описал не в классе DB, а раскиданы по другим классам
2. Повторяемость некоторых участков кода, а именно:
Получился говнокод
С точки зрения компьютера код бывает двух видов: рабочий или нерабочий, с точки зрения программиста, трёх видов: качественный, говнокод и нерабочий. Если бы человек мог читать и понимать код со скоростью компьютера, такого понятия как говнокод не существовало бы. Говнокод это рабочий код, с которым трудно работать человеку, компьютеру всё равно.

У вас есть 4 функции:
     #Сортировка по полю ID
    def sort_records_by_id(self):
        self.db.c.execute('SELECT * FROM finance ORDER BY ID')
        [self.tree.delete(i) for i in self.tree.get_children()]
        [self.tree.insert('', 'end', values=row) for row in self.db.c.fetchall()]
 
    #Сортировка по полю decription
    def sort_records_by_description(self):
        self.db.c.execute('SELECT * FROM finance ORDER BY description')
        [self.tree.delete(i) for i in self.tree.get_children()]
        [self.tree.insert('', 'end', values=row) for row in self.db.c.fetchall()]
 
    #Сортировка по полю costs
    def sort_records_by_costs(self):
        self.db.c.execute('SELECT * FROM finance ORDER BY costs')
        [self.tree.delete(i) for i in self.tree.get_children()]
        [self.tree.insert('', 'end', values=row) for row in self.db.c.fetchall()]
 
    #Сортировка по полю total
    def sort_records_by_total(self):
        self.db.c.execute('SELECT * FROM finance ORDER BY total')
        [self.tree.delete(i) for i in self.tree.get_children()]
        [self.tree.insert('', 'end', values=row) for row in self.db.c.fetchall()]
Для каждого столбца вы написали собственную функцию, а если столбцов будет 20? а если у столбцов поменяются имена? Нужна одна функция sort в классе Main (хватит одной строки кода), которая будет получать имя нажатого заголовка, передавать его в функцию sort_by класса DB (две строки кода), получать обратно отсортированные данные и передавать их функции view_records (четыре строки кода) для отображения в таблице. Столбцы таблицы нужно создавать в цикле, а имена столбцов нужно брать из базы или хотя бы из словаря или списка которые легко редактировать.

Если у вас не получится сделать это, могу показать код. Потом будет легче перенести всю работу с базой в класс DB.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB