· 6 years ago · May 30, 2019, 11:56 AM
1from tkinter import *
2import sqlite3, os
3
4#executemany для списков!!!!!!!!!!!!!!!!!!!!!!!!
5
6if os.path.isfile('TestsBase.db'):
7 conn = sqlite3.connect('TestsBase.db')
8 c = conn.cursor()
9 c.execute("SELECT * FROM TestInfo")
10else:
11 conn = sqlite3.connect('TestsBase.db')
12 c = conn.cursor()
13 sql ='create table if not exists TestInfo (id INTEGER NOT NULL, name TEXT, kolq INTEGER, sysmark TEXT, PRIMARY KEY(id))'
14 c.execute(sql)
15
16def creatt():
17 def nextstep():
18 numq=0
19 namet = textbox1.get()
20 kq = textbox2.get()
21 sm = textbox3.get()
22
23 sql = '''insert into TestInfo (name, kolq, sysmark) values (?,?,?)'''
24 c.execute(sql, (namet,kq,sm))
25 c.execute("SELECT * FROM TestInfo")
26 print(c.fetchall())
27
28 c.execute('''SELECT * FROM TestInfo WHERE name = ?;''',(namet,))
29 results=c.fetchall()
30 for result in results:
31 testi=result[0]
32
33 creat.destroy()
34 filltest = Tk()
35 filltest.title("Заполнение теста")
36 filltest.geometry("800x500")
37
38 frame1=Frame(filltest,bg='green',bd=5)
39 frame2=Frame(filltest,bg='red',bd=5)
40
41 lbl=Label(filltest, text="Заполнение теста:")
42 lbl.grid(row = 0, column = 1, sticky = W)
43 lbl=Label(filltest, text="Тип вопроса:")
44 lbl.grid(row = 1, column = 0, sticky = W)
45
46 def inputans():
47 def nextq():
48 sql ='create table if not exists TestText (id INTEGER, testid INTEGER, qtype TEXT, question TEXT, answer TEXT, varanswer TEXT, PRIMARY KEY(id))'
49 c.execute(sql)
50 c.execute("SELECT * FROM TestText")
51 result=c.fetchall()
52 if result==[]:
53 q = textbox1.get()
54 a = textbox2.get()
55 va = '---'
56 qt='1'
57 c.execute("INSERT INTO TestText (testid,qtype,question,answer,varanswer) VALUES (?,?,?,?,?)",(testi,qt,q,a,va,))
58 c.execute("SELECT * FROM TestText")
59 print(c.fetchall())
60 conn.commit()
61 else:
62 c.execute('''SELECT * FROM TestInfo WHERE id = ?;''',(testi,))
63 results=c.fetchall()
64 for result in results:
65 kq=int(result[2])
66 c.execute('''SELECT * FROM TestText WHERE testid = ?;''',(testi,))
67 results=c.fetchall()
68 print(results)
69 for result in results:
70 numq=int(result[0])
71 print(numq)
72 if numq < kq:
73 q = textbox1.get()
74 a = textbox2.get()
75 va = '---'
76 qt='1'
77 c.execute("INSERT INTO TestText (testid,qtype,question,answer,varanswer) VALUES (?,?,?,?,?)",(testi,qt,q,a,va,))
78 c.execute("SELECT * FROM TestText")
79 print(c.fetchall())
80 conn.commit()
81 else:
82 filltest.destroy()
83 info = Tk()
84 info.title("!!!")
85 info.geometry("200x100")
86
87 lbl=Label(info, text="Вы ввели все вопросы!")
88 lbl.grid(row = 0, column = 0, sticky = W + E)
89 lbl=Label(info, text="Теперь Вы можете пройти тест.")
90 lbl.grid(row = 2, column = 0, sticky = W + E)
91
92 frame2.grid_remove()
93
94 lbl=Label(frame1, text="Введите вопрос:")
95 lbl.grid(row = 0, column = 0, sticky = W)
96 lbl=Label(frame1, text="Введите верный ответ:")
97 lbl.grid(row = 1, column = 0, sticky = W)
98
99 textbox1 = Entry(frame1, width = 50)
100 textbox1.focus_set()
101 textbox1.grid(row = 0, column = 1, sticky = W)
102 textbox2 = Entry(frame1, width = 10)
103 textbox2.grid(row = 1, column = 1, sticky = W)
104
105 butnextq = Button(frame1, text = "Следующий вопрос", command = nextq)
106 butnextq.grid(row = 4, column = 1, padx=20, pady=10, sticky = W + E)
107 frame1.grid(row = 2, column = 0, columnspan = 3)
108
109 def selectans():
110 def nextq2():
111 sql ='create table if not exists TestText (id INTEGER, testid INTEGER, qtype TEXT, question TEXT, answer TEXT, varanswer TEXT, PRIMARY KEY(id))'
112 c.execute(sql)
113 c.execute("SELECT * FROM TestText")
114 result=c.fetchall()
115 if result==[]:
116 q = textbox1.get()
117 va = textbox2.get()
118 a = textbox3.get()
119 qt='2'
120 c.execute("INSERT INTO TestText (testid,qtype,question,answer,varanswer) VALUES (?,?,?,?,?)",(testi,qt,q,a,va,))
121 c.execute("SELECT * FROM TestText")
122 print(c.fetchall())
123 conn.commit()
124 else:
125 c.execute('''SELECT * FROM TestInfo WHERE id = ?;''',(testi,))
126 results=c.fetchall()
127 for result in results:
128 kq=int(result[2])
129 c.execute('''SELECT * FROM TestText WHERE testid = ?;''',(testi,))
130 results=c.fetchall()
131 for result in results:
132 numq=int(result[0])
133 if numq < kq:
134 q = textbox1.get()
135 a = textbox3.get()
136 va = textbox2.get()
137 qt='2'
138 c.execute("INSERT INTO TestText (testid,qtype,question,answer,varanswer) VALUES (?,?,?,?,?)",(testi,qt,q,a,va,))
139 c.execute("SELECT * FROM TestText")
140 print(c.fetchall())
141 conn.commit()
142 else:
143 filltest.destroy()
144 info = Tk()
145 info.title("!!!")
146 info.geometry("200x100")
147
148 lbl=Label(info, text="Вы ввели все вопросы!")
149 lbl.grid(row = 0, column = 0, sticky = W + E)
150 lbl=Label(info, text="Теперь Вы можете пройти тест.")
151 lbl.grid(row = 2, column = 0, sticky = W + E)
152
153 frame1.grid_remove()
154
155 lbl=Label(frame2, text="Введите вопрос:")
156 lbl.grid(row = 0, column = 0, sticky = W)
157 lbl=Label(frame2, text="Введите 4 варианта ответа через пробел:")
158 lbl.grid(row = 1, column = 0, sticky = W)
159 lbl=Label(frame2, text="Введите номер верного ответа:")
160 lbl.grid(row = 2, column = 0, sticky = W)
161
162 textbox1 = Entry(frame2, width = 50)
163 textbox1.focus_set()
164 textbox1.grid(row = 0, column = 1, sticky = W)
165 textbox2 = Entry(frame2, width = 50)
166 textbox2.grid(row = 1, column = 1, sticky = W)
167 textbox3 = Entry(frame2, width = 10)
168 textbox3.grid(row = 2, column = 1, sticky = W)
169
170
171 butnextq = Button(frame2, text = "Следующий вопрос", command = nextq2)
172 butnextq.grid(row = 4, column = 1, padx=20, pady=10, sticky = W + E)
173 frame2.grid(row = 3, column = 0, columnspan = 3)
174
175 qt = IntVar()
176 rbtn1 = Radiobutton(filltest, text = "Ввод ответа в строку", value = 1, variable = qt, command=inputans)
177 rbtn2 = Radiobutton(filltest, text = "Выбор ответов", value = 2, variable = qt, command=selectans)
178 rbtn1.grid(row = 1, column = 1, padx=10, pady=20)
179 rbtn2.grid(row = 1, column = 2, padx=10, pady=20)
180
181 creat = Tk()
182 creat.title("Создание теста")
183 creat.geometry("800x500")
184 lbl=Label(creat, text="Создание теста:")
185 lbl.grid(row = 0, column = 1, sticky = W)
186 lbl=Label(creat, text="Название теста:")
187 lbl.grid(row = 1, column = 0, sticky = W)
188 lbl=Label(creat, text="Кол-во вопросов:")
189 lbl.grid(row = 2, column = 0, sticky = W)
190 lbl=Label(creat, text="Система оценивания:")
191 lbl.grid(row = 3, column = 0, sticky = W)
192 lbl=Label(creat, text="1: Подсчет баллов, 2: Вывод оценки")
193 lbl.grid(row = 3, column = 1, sticky = W+E)
194
195 textbox1 = Entry(creat, width = 50)
196 textbox1.focus_set()
197 textbox1.grid(row = 1, column = 1, sticky = W)
198 textbox2 = Entry(creat, width = 10)
199 textbox2.grid(row = 2, column = 1, sticky = W)
200 textbox3 = Entry(creat, width = 10)
201 textbox3.grid(row = 3, column = 1, sticky = W)
202
203 butnext = Button(creat, text = "Далее", command = nextstep)
204 butnext.grid(row = 4, column = 1, padx=200, pady=100, sticky = W + E)
205
206#_________________________________________________________________________
207
208def executet():
209
210 execute = Tk()
211 execute.title("Прохождение теста")
212 execute.geometry("800x500")
213 lbl=Label(execute, text="Введите название существующего теста и свое имя.")
214 lbl.grid(row = 0, column = 1, sticky = W)
215
216 lbl=Label(execute, text="Название теста:")
217 lbl.grid(row = 3, column = 0, sticky = W)
218 textbox1 = Entry(execute, width = 50)
219 textbox1.grid(row = 3, column = 1, sticky = W)
220
221 lbl=Label(execute, text="Имя:")
222 lbl.grid(row = 4, column = 0, sticky = W)
223 textbox2 = Entry(execute, width = 50)
224 textbox2.grid(row = 4, column = 1, sticky = W)
225
226 sql ='create table if not exists TestAnswers (id INTEGER NOT NULL, name TEXT, uanswer TEXT, testid INTEGER, umark INTEGER, PRIMARY KEY(id))'
227 c.execute(sql)
228
229 def starttest():
230 def nexta():
231 def nextaa():
232 c.execute('''SELECT * FROM TestText WHERE testid = ? AND id = ?;''',(takenid,ida))
233 results=c.fetchall()
234 for result in results:
235 questiontype=int(result[2])
236
237 if questiontype == 1:
238 uans = textbox1.get()
239 c.execute("INSERT INTO TestAnswers (uanswer) VALUES (?)",(uans,))
240 conn.commit()
241
242 if questiontype == 2:
243 print(vuans)
244 c.execute("INSERT INTO TestAnswers (uanswer) VALUES (?)",(vuans,))
245 conn.commit()
246
247 c.execute("UPDATE TestAnswers SET testid = ? WHERE id = ?",(takenid,ida))
248 conn.commit()
249
250 if ida == kq:
251 start.destroy()
252 resulttest = Tk()
253 resulttest.title("Результаты")
254 resulttest.geometry("800x500")
255 lbl=Label(resulttest, text="Тест пройден!")
256 lbl.grid(row = 0, column = 0, sticky = W)
257 i=1
258 point=0
259 c.execute('''UPDATE TestAnswers SET name = ? WHERE testid = ?;''',(username,takenid,))
260 conn.commit()
261 c.execute('''SELECT * FROM TestAnswers''')
262 print(c.fetchall())
263 while (i<=kq):
264 c.execute('''SELECT * FROM TestText WHERE id = ?;''',(i,))
265 que=c.fetchall()
266 for correcta in que:
267 correctans=correcta[4]
268 c.execute('''SELECT * FROM TestAnswers WHERE id = ?;''',(i,))
269 ans=c.fetchall()
270 for ua in ans:
271 yourans=ua[2]
272 if correctans == yourans:
273 point=point+1
274 i=i+1
275 c.execute('''SELECT * FROM TestInfo WHERE name = ?;''',(namecheck,))
276 results=c.fetchall()
277 for result in results:
278 typemark=result[3]
279 if typemark == '1':
280 lbl2=Label(resulttest, text="Правильных ответов: ")
281 lbl2.grid(row = 1, column = 0, sticky = W)
282 lbl2=Label(resulttest, text=point)
283 lbl2.grid(row = 1, column = 1, sticky = W)
284 mark = point
285 c.execute('''UPDATE TestAnswers SET umark = ? WHERE name = ?;''',(mark,username,))
286 c.execute("INSERT INTO TestAnswers VALUES (?,?,?,?,?)",('-','-','-','-','-',))
287 conn.commit()
288 else:
289 mark = (point/kq)*100
290 if mark < 50:
291 mark = 2
292 if (mark >= 50) and (mark<75):
293 mark = 3
294 if (mark >= 75) and (mark < 90):
295 mark = 4
296 if (mark >= 90) and (mark <= 100):
297 mark = 5
298 c.execute('''UPDATE TestAnswers SET umark = ? WHERE name = ?;''',(mark,username,))
299 c.execute("INSERT INTO TestAnswers VALUES (?,?,?,?,?)",('-','-','-','-','-',))
300 lbl2=Label(resulttest, text="Оценка: ")
301 lbl2.grid(row = 1, column = 0, sticky = W)
302 lbl2=Label(resulttest, text=mark)
303 lbl2.grid(row = 1, column = 1, sticky = W)
304 conn.commit()
305 else:
306 start.withdraw()
307 nexta()
308
309 start = Tk()
310 start.title("Вопрос")
311 start.geometry("800x500")
312
313 c.execute('''SELECT * FROM TestInfo WHERE id = ?;''',(takenid,))
314 results=c.fetchall()
315 for result in results:
316 kq=int(result[2])
317
318 lbl=Label(start, text="Всего вопросов:")
319 lbl.grid(row = 0, column = 0, sticky = W)
320 lbl=Label(start, text=kq)
321 lbl.grid(row = 0, column = 1, sticky = W)
322#!!!!!!!!!!!!!!!!!!!!!!!!!
323 c.execute("SELECT * FROM TestAnswers")
324 result = c.fetchall()
325 ida = 0
326 if result == []:
327 ida=1
328 else:
329 c.execute('''SELECT * FROM TestAnswers WHERE id = ?;''',(takenid,))
330 result = c.fetchall()
331 for i in result:
332 check = int(i[4])
333 if check == '-':
334 ida = 1
335 else:
336 c.execute("SELECT * FROM TestAnswers")
337 result = c.fetchall()
338 for i in result:
339 ida = int(i[0])
340 ida=ida+1
341 c.execute('''SELECT * FROM TestText WHERE testid = ? AND id = ?;''',(takenid,ida))
342 results=c.fetchall()
343 for result in results:
344 numq=int(result[0])
345 questiontype=int(result[2])
346 question=str(result[3])
347 answer=str(result[4])
348 varanswer=str(result[5])
349 print(questiontype)
350
351 if questiontype == 1:
352 lbl=Label(start, text=question)
353 lbl.grid(row = 2, column = 0, sticky = W)
354
355 textbox1 = Entry(start, width = 50)
356 textbox1.focus_set()
357 textbox1.grid(row = 3, column = 0, sticky = W)
358#HEREEEEEEEEEEEEEEEEEEE
359 if questiontype == 2:
360 def event():
361 txt=str(varans.get())
362 lbl=Label(start, text=txt)
363 lbl.grid(row = 7, column = 0, sticky = W)
364
365 lbl=Label(start, text=question)
366 lbl.grid(row = 2, column = 0, sticky = W)
367 varanswer=varanswer.split()
368 v1 = str(varanswer[0])
369 v2 = str(varanswer[1])
370 v3 = str(varanswer[2])
371 v4 = str(varanswer[3])
372
373 varans = IntVar()
374 cbtn1 = Checkbutton(start, text = v1, variable = varans, onvalue='1', offvalue=0, command = event)
375 cbtn2 = Checkbutton(start, text = v2, variable = varans, onvalue='2', offvalue=0, command = event)
376 cbtn3 = Checkbutton(start, text = v3, variable = varans, onvalue='3', offvalue=0, command = event)
377 cbtn4 = Checkbutton(start, text = v4, variable = varans, onvalue='4', offvalue=0, command = event)
378 cbtn1.grid(row = 3, column = 1)
379 cbtn2.grid(row = 4, column = 1)
380 cbtn3.grid(row = 5, column = 1)
381 cbtn4.grid(row = 6, column = 1)
382
383 vuans = varans.get()
384
385 butnextq = Button(start, text = "Далее", command = nextaa)
386 butnextq.grid(row = 7, column = 1, sticky = W + E)
387
388 lbl=Label(start, text="Номер текущего вопроса:")
389 lbl.grid(row = 1, column = 0, sticky = W)
390 lbl=Label(start, text=ida)
391 lbl.grid(row = 1, column = 1, sticky = W)
392
393 namecheck = textbox1.get()
394 username = textbox2.get()
395 takenid = IntVar()
396 takenid = 0
397 c.execute('''SELECT * FROM TestInfo WHERE name = ?;''',(namecheck,))
398 results=c.fetchall()
399 for i in results:
400 takenid = i[0]
401 if results == []:
402 print('Error')
403 error = Tk()
404 error.title("Ошибка")
405 error.geometry("200x100")
406 lbl=Label(error, text="Тест не найден.")
407 lbl.grid(row = 0, column = 1, sticky = W + E)
408 lbl=Label(error, text="Попробуйте ввести название теста снова.")
409 lbl.grid(row = 1, column = 1, sticky = W + E)
410 else:
411 nexta()
412
413 butnext = Button(execute, text = "Начать", command = starttest)
414 butnext.grid(row = 5, column = 1, padx=200, pady=100, sticky = W + E)
415
416def checkt():
417 def checktnext():
418 namet = textbox1.get()
419 namep = textbox2.get()
420
421 c.execute('''SELECT * FROM TestInfo WHERE name = ?;''',(namet,))
422 results=c.fetchall()
423 for result in results:
424 testid = result[0]
425
426 c.execute('''SELECT * FROM TestAnswers WHERE name = ? AND testid = ?;''',(namep,testid,))
427 results=c.fetchall()
428 for result in results:
429 mark = result[4]
430
431 checkn = Tk()
432 checkn.title("Результаты")
433 checkn.geometry("800x500")
434
435 lbl=Label(checkn, text='Последняя оценка по тесту: ')
436 lbl.grid(row = 0, column = 0, sticky = W)
437 lbl=Label(checkn, text=namet)
438 lbl.grid(row = 1, column = 0, sticky = W)
439 lbl=Label(checkn, text=mark)
440 lbl.grid(row = 1, column = 1, sticky = W)
441 lbl=Label(checkn, text='История:')
442 lbl.grid(row = 2, column = 0, sticky = W)
443 lbl=Label(checkn, text=results)
444 lbl.grid(row = 3, column = 2, sticky = W)
445
446
447 def checktnextt():
448 checkn = Tk()
449 checkn.title("Результаты")
450 checkn.geometry("800x500")
451
452 c.execute('''SELECT * FROM TestAnswers''')
453 results=c.fetchall()
454
455 lbl=Label(checkn, text="Вся база:")
456 lbl.grid(row = 1, column = 0, sticky = W)
457
458 lbl=Label(checkn, text=results)
459 lbl.grid(row = 2, column = 0, sticky = W + E)
460
461
462 check = Tk()
463 check.title("Результаты")
464 check.geometry("800x500")
465
466 lbl=Label(check, text="INFO:")
467 lbl.grid(row = 1, column = 0, sticky = W)
468
469 lbl=Label(check, text="Введите название теста:")
470 lbl.grid(row = 2, column = 0, sticky = W)
471 textbox1 = Entry(check, width = 50)
472 textbox1.grid(row = 2, column = 1, sticky = W)
473
474 lbl=Label(check, text="Введите имя:")
475 lbl.grid(row = 3, column = 0, sticky = W)
476 textbox2 = Entry(check, width = 50)
477 textbox2.grid(row = 3, column = 1, sticky = W)
478
479 butncheck = Button(check, text = "Посмотреть результаты по введенным данным", command = checktnext)
480 butncheck.grid(row = 4, column = 1, sticky = W + E)
481 butncheck2 = Button(check, text = "Посмотреть всю историю прохождений", command = checktnextt)
482 butncheck2.grid(row = 5, column = 1, sticky = W + E)
483
484
485window = Tk()
486window.title("Тест")
487window.geometry("500x500")
488butcreat = Button(window, text = "Создать тест", command = creatt)
489butstart = Button(window, text = "Пройти тест", command = executet)
490butcheck = Button(window, text = "Посмотреть результаты", command = checkt)
491butcreat.grid(row = 2, column = 2, padx=180, pady=50, sticky = W + E)
492butstart.grid(row = 3, column = 2, padx=180, pady=50, sticky = W + E)
493butcheck.grid(row = 4, column = 2, padx=180, pady=50, sticky = W + E)
494
495conn.commit()
496window.mainloop()