Уведомления

Группа в Telegram: @pythonsu

#1 Июль 20, 2020 13:33:42

Feelgood
Зарегистрирован: 2016-08-04
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Обновление treeview после добавления данных в БД

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()

Офлайн

#2 Июль 21, 2020 12:08:44

rami
Зарегистрирован: 2018-01-08
Сообщения: 281
Репутация: +  72  -
Профиль   Отправить e-mail  

Обновление treeview после добавления данных в БД

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.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version