0 / 0 / 0
Регистрация: 24.04.2019
Сообщений: 2
1

GUI-приложение Tkinter с БД SQL

21.05.2019, 22:36. Показов 2197. Ответов 1

Author24 — интернет-сервис помощи студентам
Прошу помощи в организации поиска и фильтрации.


Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
import sqlite3  # импорт модуля SQLite
import tkinter as tk  # импорт библиотеки tkinter
from tkinter import ttk # импорт модуля TTk
 
class Main(tk.Frame):
    def __init__(self, root):
        super().__init__(root)
        self.init_main()
        self.db = db
        self.view_records()
 
    def init_main(self): # главное окно
        toolbar = tk.Frame(bg='#d7d8e0', bd=2)
        toolbar.pack(side=tk.TOP, fill=tk.X)
 
        self.add_img = tk.PhotoImage(file='add.gif')
        btn_open_dialog = tk.Button(toolbar, text='Добавить позицию', command=self.open_dialog, bg='#d7d8e0', bd=0,
                                    compound=tk.TOP, image=self.add_img)
        btn_open_dialog.pack(side=tk.LEFT)
 
        self.update_img = tk.PhotoImage(file='update.gif')
        btn_edit_dialog = tk.Button(toolbar, text='Редактировать', bg='#d7d8e0', bd=0, image=self.update_img,
                                    compound=tk.TOP, command=self.open_update_dialog)
        btn_edit_dialog.pack(side=tk.LEFT)
 
        self.delete_all_img = tk.PhotoImage(file='delete_all.gif')
        btn_delete_all_records = tk.Button(toolbar, text='Очистить', bg='#d7d8e0', bd=0, image=self.delete_all_img,
                                      compound=tk.TOP, command=self.delete_all_records)
        btn_delete_all_records.pack(side=tk.RIGHT)
 
        self.search_img = tk.PhotoImage(file='search.gif')
        btn_open_search_dialog = tk.Button(toolbar, text='Поиск', bg='#d7d8e0', bd=0, image=self.search_img,
                                      compound=tk.TOP, command=self.open_search_dialog)
        btn_open_search_dialog.pack(side=tk.RIGHT)
 
        self.tree = ttk.Treeview(self, columns=('ID', 'description', 'costs', 'total'), height=15, show='headings')
 
        self.tree.column('ID', width=30, anchor=tk.CENTER)
        self.tree.column('description', width=365, anchor=tk.CENTER)
        self.tree.column('costs', width=150, anchor=tk.CENTER)
        self.tree.column('total', width=100, anchor=tk.CENTER)
 
        self.tree.heading('ID', text='ID')
        self.tree.heading('description', text='Наименование')
        self.tree.heading('costs', text='Статья дохода/расхода')
        self.tree.heading('total', text='Сумма')
 
        self.tree.pack()
 
    def records(self, description, costs, total):
        self.db.insert_data(description, costs, total)
        self.view_records()
 
    def update_record(self, description, costs, total):
        self.db.c.execute('''UPDATE finance SET description=?, costs=?, total=? WHERE ID=?''',
                          (description, costs, total, self.tree.set(self.tree.selection()[0], '#1')))
        self.db.conn.commit()
        self.view_records()
 
    def view_records(self):
        self.db.c.execute('''SELECT * FROM finance''')
        [self.tree.delete(i) for i in self.tree.get_children()]
        [self.tree.insert('', 'end', values=row) for row in self.db.c.fetchall()]
 
    def search(self):
        self.db.c.execute('''''')
 
    def delete_all_records(self):
        self.db.c.execute('''DELETE FROM finance''')
        self.db.conn.commit()
        self.view_records()
 
    def open_dialog(self):
        Child() # вызов дочернего окна
 
    def open_update_dialog(self):
        Update()
 
    def open_search_dialog(self):
        Search()
 
 
class Child(tk.Toplevel):
    def __init__(self):
        super().__init__(root)
        self.init_child()
        self.view = app
 
    def init_child(self):
        self.title('Добавить доходы/расходы')
        self.geometry('400x220+400+300')
        self.resizable(False, False)
 
        label_description = tk.Label(self, text='Наименование:')
        label_description.place(x=50, y=50)
        label_select = tk.Label(self, text='Статья дохода/расхода:')
        label_select.place(x=50, y=80)
        label_sum = tk.Label(self, text='Сумма:')
        label_sum.place(x=50, y=110)
 
        self.entry_description = ttk.Entry(self)
        self.entry_description.place(x=200, y=50)
 
        self.entry_money = ttk.Entry(self)
        self.entry_money.place(x=200, y=110)
 
        self.combobox = ttk.Combobox(self, values=[u'Доход', u'Расход'])
        self.combobox.current(0)
        self.combobox.place(x=200, y=80)
 
        btn_cancel = ttk.Button(self, text='Закрыть', command=self.destroy)
        btn_cancel.place(x=300, y=170)
 
        self.btn_ok = ttk.Button(self, text='Добавить')
        self.btn_ok.place(x=220, y=170)
        self.btn_ok.bind('<Button-1>', lambda event: self.view.records(self.entry_description.get(),
                                                                       self.combobox.get(),
                                                                       self.entry_money.get()))
 
        self.grab_set() # перехват всех событий, происходящих в приложении
        self.focus_set() # захват и удержание фокуса
 
 
class Update(Child):
    def __init__(self):
        super().__init__()
        self.init_edit()
        self.view = app
 
    def init_edit(self):
        self.title('Редактировать позицию')
        btn_edit = ttk.Button(self, text='Редактировать')
        btn_edit.place(x=205, y=170)
        btn_edit.bind('<Button-1>', lambda event: self.view.update_record(self.entry_description.get(),
                                                                          self.combobox.get(),
                                                                          self.entry_money.get()))
 
        self.btn_ok.destroy()
 
class Search(Child):
    def __init__(self):
        super().__init__()
        self.init_search()
        self.view = app
 
    def init_search(self):
        self.title('Поиск')
        btn_edit = ttk.Button(self, text='Найти')
        btn_edit.place(x=205, y=170)
        btn_edit.bind('<Button-1>', lambda event: self.view.update_record())
 
        self.btn_ok.destroy()
 
class DB:
    def __init__(self):
        self.conn = sqlite3.connect('finance.db')
        self.c = self.conn.cursor()
        self.c.execute(
            '''CREATE TABLE IF NOT EXISTS finance (id integer primary key, description text, costs text, total real)''')
        self.conn.commit()
 
    def insert_data(self, description, costs, total):
        self.c.execute('''INSERT INTO finance(description, costs, total) VALUES (?, ?, ?)''',
                       (description, costs, total))
        self.conn.commit()
 
 
if __name__ == "__main__":
    root = tk.Tk() # корневое окно программы
    db = DB() # экземпляр класса DB
    app = Main(root)
    app.pack()
    root.title("Household finance") # название окна
    root.geometry("650x450+300+200") # размеры окна
    root.resizable(False, False) # фиксация окна по обоим осям
    root.mainloop() # запуск главного цикла обработки событий

То бишь остаётся закончить функцию def search в классе Main и class Search, чтобы открывалось аналогичное окно для поиска с фильтрацией.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.05.2019, 22:36
Ответы с готовыми решениями:

Как лучше и быстрее из SQL в QVector и в GUI или сразу из SQL в GUI
Доброе время суток! Ну собственно вопрос в теме, как лучше сделать. Сначала прочитать SQLite в...

GUI tkinter textbox
Доброго времени суток всем. начал изучать tkinter, у меня windows, python 2.7 застопорился на...

Как запустить GUI приложение (например, notepad.exe) без отображения GUI?
Добрый день. Интересует есть ли такая возможность, как запустить GUI приложение (например,...

GUI, Tkinter, canvas and frame
Привет, я только начинаю это изучать, так что вопрос наверное глупый. В чём разница между canvas и...

Python, tkinter, переменные в GUI
Здраствуйте, помогите пожалуйста. Задание: Напишите скрипт, как в примере с флажками; в отличии...

1
0 / 0 / 0
Регистрация: 24.04.2019
Сообщений: 2
22.05.2019, 00:38  [ТС] 2
___
Изображения
    
0
22.05.2019, 00:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.05.2019, 00:38
Помогаю со студенческими работами здесь

Python, модуль tkinter GUI
Здравствуйте, помогите пожалуйста не получается выполнить задание Задание: Напишите приложение с...

GUI tkinter зависание интерфейса
Здравствуйте Мне нужно сделать простой интерфейс для программы. При нажатии на кнопку Start...

Phyton gui с использованием Tkinter
Можете помочь задачей. Необходимо найти приблизительное значение e и pi с помощью формул...

tkinter корректно запустить GUI
Здравствуйте! В Питоне совсем недавно и хочется автоматизировать рутинные задачи со звуковыми...

В чем дело. Python GUI tkinter
Пишу мелкую игру для школы, программа задает вопрос, пользователь вводит ответ, она выводит...

Как переделать консольное приложение в приложение с GUI?
Есть приложение, работающее в консоли, захотелось сделать с графическим интерфейсом, уперся в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru