· 5 years ago · Apr 16, 2020, 07:52 PM
1import tkinter as tk
2from tkinter import ttk
3import sqlite3
4import csv
5
6
7class MainWindow(tk.Frame):
8 def __init__(self, root):
9 super().__init__(root)
10 self.init_main()
11 self.db = db
12 self.db.load_data()
13 #self.show_projects()
14
15 def init_main(self):
16 self.toolbar = tk.Frame(bd=2)
17 self.toolbar.pack(side=tk.TOP)
18 self.btn_init_dialog = tk.Button(self.toolbar,
19 text='загрузить данные \n(демонстрация загрузки )',
20 command=self.show_projects,
21 bg='#d7d8e0',
22 bd=0,
23 compound=tk.TOP)
24 self.btn_init_dialog.pack(side=tk.LEFT)
25
26 self.btn_show_project = tk.Button(self.toolbar,
27 text='показать проект',
28 command=self.show_tasks_window,
29 bg='#d7d8e0',
30 bd=0,
31 compound=tk.TOP)
32 self.btn_show_project.pack(side=tk.LEFT)
33
34 self.project_grid = ttk.Treeview(self, columns=("name", "description", "deadline"),
35 height=15, show='headings')
36 self.project_grid.column('name', width=150, anchor='w')
37 self.project_grid.column('description', minwidth=30, anchor='w', stretch=True)
38 self.project_grid.column('deadline', width=150, anchor='w')
39 self.project_grid.heading('name', text='Название')
40 self.project_grid.heading('description', text='Описание')
41 self.project_grid.heading('deadline', text='Дедлайн')
42 vsbar = ttk.Scrollbar(self, orient="vertical", command=self.project_grid.yview)
43
44 self.project_grid.pack(side='left', fill='x')
45 vsbar.pack(side='right', fill='y')
46
47 def show_projects(self):
48 print("""init show_projects """, self.db.get_projects_list())
49 self.db.cur.execute('''SELECT name, description, deadline FROM Project;''')
50 for row in self.db.cur.fetchall():
51 self.project_grid.insert('', 'end', values=row)
52 pass
53 #just for fun. delete button
54 #self.toolbar.btn_init_dialog.destroy()
55
56 def show_tasks_window(self):
57 project_name = self.project_grid.set(self.project_grid.selection()[0], '#1')
58 child_window = ProjectWindow(project_name)
59
60class ProjectWindow(tk.Toplevel):
61 def __init__(self, project_name):
62 super().__init__(app)
63
64 self.db = db
65 self.show_project_window(project_name)
66
67 def show_project_window(self, project_name):
68 self.geometry('600x300+20+20')
69 self.title(f'Задания проекта {project_name}')
70 self.closebar = tk.Frame(self, bd=2)
71 self.btn_close = tk.Button(self.closebar,
72 text='закрыть',
73 command=self.destroy,
74 bg='#d7d8e0',
75 bd=0,
76 compound=tk.CENTER)
77 self.btn_close.pack(side=tk.RIGHT)
78 self.closebar.pack(side=tk.BOTTOM)
79 self.task_grid = ttk.Treeview(self, columns=("priority", "details", "status", "deadline", "completed"),
80 height=15, show='headings')
81 self.task_grid.column('priority', width=100, anchor='w')
82 self.task_grid.column('details', minwidth=100, anchor='w')
83 self.task_grid.column('status', width=100, anchor='w')
84 self.task_grid.column('deadline', width=100, anchor='w')
85 self.task_grid.column('completed', width=100, anchor='w')
86 self.task_grid.heading('priority', text='priority')
87 self.task_grid.heading('details', text='details')
88 self.task_grid.heading('status', text='status')
89 self.task_grid.heading('deadline', text='deadline')
90 self.task_grid.heading('completed', text='completed')
91
92 self.db.cur.execute('SELECT priority, details, status, deadline, completed FROM Tasks where Project = ?;',
93 (project_name,))
94 for row in self.db.cur.fetchall():
95 self.task_grid.insert('', 'end', values=row)
96
97 vsbar = ttk.Scrollbar(self, orient="vertical", command=self.task_grid.yview)
98 self.task_grid.pack(side='left', fill='x')
99 vsbar.pack(side='right', fill='y')
100
101 # сделать окно модальным, забрать фокус и возможность переключения на родительское.
102 self.grab_set()
103 self.focus_set()
104
105class DB():
106 def __init__(self):
107 #self.conn = sqlite3.connect(":memory:")
108 self.conn = sqlite3.connect('db.db')
109 self.cur = self.conn.cursor()
110 self.init_db()
111
112 def init_db(self):
113 """ Инициализация базы: создание таблиц. """
114 sqlcmd = """
115CREATE TABLE IF NOT EXISTS `Project` (
116 `name` TEXT,
117 `description` TEXT,
118 `deadline` TEXT
119);
120
121CREATE TABLE IF NOT EXISTS `Tasks` (
122 `id` NUMERIC UNIQUE,
123 `priority` INTEGER,
124 `details` TEXT,
125 `status` TEXT,
126 `deadline` TEXT,
127 `completed` TEXT,
128 `Project` TEXT,
129 PRIMARY KEY(`id`)
130);
131 """
132
133 for command in sqlcmd.split(';'):
134 try:
135 self.cur.execute(command)
136 except sqlite3.OperationalError as err:
137 print("Error {0} on {1}".format(err, command))
138 self.conn.commit()
139
140 def get_projects_list(self):
141 """ возвращает список проектов из бд"""
142 self.cur.execute("SELECT name FROM Project;")
143 projects_list = self.cur.fetchall()
144 projects_list = [row[0] for row in projects_list]
145 return projects_list
146
147 def load_data(self):
148 """ Загрузка таблиц из файлов с .csv (должны существовать, с заголовком и верным кол-вом полей)"""
149 # проекты - это объекты из игры stellaris.
150 with open('project.csv', encoding='cp1251') as csv_file:
151 csv_reader = csv.reader(csv_file, delimiter=',', lineterminator='\r\n')
152 line_count = 0
153 self.cur.execute('DELETE FROM Project;')
154 for row in csv_reader:
155 if line_count == 0:
156 fieldnames = row
157 line_count += 1
158 else:
159 try:
160 command = f'insert into Project values ("{row[0]}", "{row[1]}", "{row[2]}" );'
161 self.cur.execute(command)
162 except sqlite3.OperationalError as err:
163 print("Error {0} on {1}".format(err, command))
164 line_count += 1
165 self.conn.commit()
166
167 with open('tasks.csv', encoding='cp1251') as csv_file:
168 csv_reader = csv.reader(csv_file, delimiter=',', lineterminator='\r\n')
169 line_count = 0
170 self.cur.execute('DELETE FROM Tasks;')
171 for row in csv_reader:
172 if line_count == 0:
173 fieldnames = row
174 line_count += 1
175 else:
176 try:
177 task_id, task_priority, task_details, task_status, task_deadline, task_completed, task_Project = row
178 command = f'insert into Tasks (id, priority, details, status, deadline, completed, Project) \
179 values ( {task_id}, {task_priority}, "{task_details}", "{task_status}", "{task_deadline}", "{task_completed}", "{task_Project}" );'
180 self.cur.execute(command)
181
182 except sqlite3.OperationalError as err:
183 print("Error {0} on {1}".format(err, command))
184 line_count += 1
185 self.conn.commit()
186
187
188if __name__ == "__main__":
189 root = tk.Tk()
190 root.title('HW10')
191 root.geometry('650x450')
192 root.resizable(False, False)
193
194 db = DB()
195
196 app = MainWindow(root)
197 app.pack()
198
199 root.mainloop()