· 8 years ago · Mar 28, 2018, 01:34 PM
1CLASS start:
2 FUNCTION __init__(self):
3 master=tk.Tk()
4 login()
5 ENDFUNCTION
6
7 FUNCTION login(self):
8 loginscreen.menu(self, master)
9 ENDFUNCTION
10
11 FUNCTION authStudent(self, user):
12 studentinterface.studentInterface( master, self, user)
13 ENDFUNCTION
14
15 FUNCTION authTeacher(self):
16 teacherinterface.teacherInterface( master, self)
17 ENDFUNCTION
18
19ENDCLASS
20
21CLASS menu:
22 FUNCTION __init__(self, mainApp, master):
23 mainApp <- mainApp
24 master <- master
25 draw()
26 login.createDb()
27 ENDFUNCTION
28
29 FUNCTION draw(self):
30 master.title('Login')
31 loginSelectionFrame <- tk.Frame( master)
32 loginSelectionFrame.pack()
33 teacherButton <- tk.Button( loginSelectionFrame, text='Teacher', padx=20, pady=20, command= teacherLogin)
34 studentButton <- tk.Button( loginSelectionFrame, text='Student', padx=20, pady=20, command= studentLogin)
35 teacherButton.grid(column=1, row=0)
36 studentButton.grid(column=0, row=0)
37 ENDFUNCTION
38
39 FUNCTION teacherLogin(self):
40 master.title('Teacher Login')
41 loginSelectionFrame.destroy()
42 teacherLoginFrame <- tk.Frame( master)
43 teacherLoginFrame.pack()
44 teacherUsernameLabel <- tk.Label( teacherLoginFrame, text='Username: ', padx=20, pady=20)
45 teacherPasswordLabel= tk.Label( teacherLoginFrame, text='Password: ', padx=20)
46 teacherUsernameLabel.grid(column=0, row=0)
47 teacherPasswordLabel.grid(column=0, row=1)
48 teacherUsernameEntry <- tk.Entry( teacherLoginFrame)
49 teacherUsernameEntry.grid(column=1, row=0)
50 teacherPasswordEntry <- tk.Entry( teacherLoginFrame)
51 teacherPasswordEntry.grid(column=1, row=1)
52 teacherLoginButton <- tk.Button( teacherLoginFrame, text='Login', command= tLogin)
53 teacherLoginButton.grid(columnspan=2, column=1, row=4)
54 teacherBackButton <- tk.Button( teacherLoginFrame, text='Back', command= backTeacher)
55 teacherBackButton.grid(column=0, row=4)
56 teacherErrorMessage <- tk.StringVar()
57 teacherErrorLabel <- tk.Label( teacherLoginFrame, textvariable= teacherErrorMessage)
58 teacherErrorLabel.grid(column=1, row=3)
59 master.bind('<Return>', lambda logintoprogram: tLogin())
60 ENDFUNCTION
61
62 FUNCTION studentLogin(self):
63 master.title('Student Login')
64 loginSelectionFrame.destroy()
65 studentLoginFrame <- tk.Frame( master)
66 studentLoginFrame.pack()
67 studentUsernameLabel <- tk.Label( studentLoginFrame, text='Username: ', padx=20, pady=20)
68 studentPasswordLabel= tk.Label( studentLoginFrame, text='Password: ', padx=20)
69 studentUsernameLabel.grid(column=0, row=0)
70 studentPasswordLabel.grid(column=0, row=1)
71 studentUsernameEntry <- tk.Entry( studentLoginFrame)
72 studentUsernameEntry.grid(column=1, row=0)
73 studentPasswordEntry <- tk.Entry( studentLoginFrame)
74 studentPasswordEntry.grid(column=1, row=1)
75 studentLoginButton <- tk.Button( studentLoginFrame, text='Login', command= sLogin)
76 studentLoginButton.grid(columnspan=2, column=1, row=4)
77 studentBackButton <- tk.Button( studentLoginFrame, text='Back', command= backStudent)
78 studentBackButton.grid(column=0, row=4)
79 studentErrorMessage <- tk.StringVar()
80 studentErrorLabel <- tk.Label( studentLoginFrame, textvariable= studentErrorMessage)
81 studentErrorLabel.grid(column=1, row=3)
82 master.bind('<Return>', lambda logintoprogram: sLogin())
83 ENDFUNCTION
84
85 FUNCTION backStudent(self):
86 studentLoginFrame.grid_forget()
87 ENDFOR
88 studentLoginFrame.destroy()
89 draw()
90 ENDFUNCTION
91
92 FUNCTION backTeacher(self):
93 teacherLoginFrame.grid_forget()
94 ENDFOR
95 teacherLoginFrame.destroy()
96 draw()
97 ENDFUNCTION
98
99 FUNCTION dbConnection(self):
100 conn <- sqlite3.connect('quiz.db')
101 c <- conn.cursor()
102 ENDFUNCTION
103
104 FUNCTION dbCloseConnection(self):
105 conn.close()
106 ENDFUNCTION
107
108 FUNCTION sLogin(self):
109 dbConnection()
110 studentUsername= studentUsernameEntry.get()
111 c.execute('SELECT password FROM slogin WHERE username <- ?', ( studentUsername,))
112 password <- c.fetchone()
113 IF password = None:
114 studentErrorMessage.set('Wrong Username')
115 ELSEIF password[0] = studentPasswordEntry.get():
116 dbCloseConnection()
117 studentErrorMessage.set('')
118 studentLoginFrame.destroy()
119 mainApp.authStudent( studentUsername)
120 ELSE:
121 studentErrorMessage.set('Wrong Password')
122 ENDIF
123 ENDFUNCTION
124
125 FUNCTION tLogin(self):
126 dbConnection()
127 c.execute('SELECT password FROM tlogin WHERE username <- ?', ( teacherUsernameEntry.get(),))
128 password <- c.fetchone()
129 IF password = None:
130 teacherErrorMessage.set('Wrong Username')
131 ELSEIF password[0] = teacherPasswordEntry.get():
132 dbCloseConnection()
133 teacherErrorMessage.set('')
134 teacherLoginFrame.destroy()
135 mainApp.authTeacher()
136 ELSE:
137 teacherErrorMessage.set('Wrong Password')
138
139class login:
140 FUNCTION createDb():
141 conn <- sqlite3.connect('quiz.db')
142 c <- conn.cursor()
143 c.execute('CREATE TABLE IF NOT EXISTS slogin (username TEXT PRIMARY KEY, password TEXT, forename TEXT, surname TEXT);')
144 ENDFOR
145 c.execute('CREATE TABLE IF NOT EXISTS tlogin (username TEXT PRIMARY KEY, password text);')
146 conn.commit()
147 conn.close()
148END CLASS
149
150CLASS studentInterface:
151 FUNCTION __init__(self, master, mainApp, user):
152 master <- master
153 username <- user
154 mainApp <- mainApp
155 drawInterface()
156 ENDFUNCTION
157
158 FUNCTION drawInterface(self):
159 master.title('Student Menu: '+ username)
160 menuFrame <- tk.Frame(master)
161 menuFrame.pack()
162 selectQuizButton <- tk.Button( menuFrame, text='Select Quiz', command= selectQuiz)
163 selectQuizButton.grid(column=0, row=0)
164 selectedQuiz <- tk.StringVar()
165 selectedQuiz.set('')
166 selectedQuizLabel <- tk.Label( menuFrame, textvariable= selectedQuiz)
167 selectedQuizLabel.grid(column=1, row=1)
168 quizSelectedLabel <- tk.Label( menuFrame, text='Quiz Selected')
169 quizSelectedLabel.grid(column=0, row=1)
170 startQuizButton <- tk.Button( menuFrame, text='Start Quiz', command= startQuiz, state='disabled')
171 startQuizButton.grid(column=0, row=2)
172 logoutButton <- tk.Button( menuFrame, text='Logout', command= logout)
173 logoutButton.grid(column=0, row=3)
174 ENDFUNCTION
175
176 FUNCTION selectQuiz(self):
177 menuFrame.destroy()
178 selectQuizFrame <- tk.Frame( master)
179 selectQuizFrame.pack()
180 conn <- sqlite3.connect('questionDb.db')
181 c <- conn.cursor()
182 c.execute("SELECT name FROM sqlite_master WHERE type='table';")
183 quizzes <- c.fetchall()
184 quizListBox <- tk.Listbox( selectQuizFrame)
185 quizListBox.grid(column=0, row=0)
186 for i in quizzes:
187 quizListBox.insert(tk.END, i)
188 ENDFOR
189 selectButton <- tk.Button( selectQuizFrame, text='Select', command= selectListboxOption)
190 selectButton.grid(column=1, row=0, rowspan=2)
191 ENDFUNCTION
192
193 FUNCTION selectListboxOption(self):
194 try:
195 i <- quizListBox.curselection()
196 option <- quizListBox.get(i[0])[0]
197 selectQuizFrame.destroy()
198 drawInterface()
199 selectedQuiz.set(option)
200 startQuizButton.configure(state='normal')
201 except IndexError:
202 pass
203 ENDFUNCTION
204
205 FUNCTION startQuiz(self):
206 menuFrame.destroy()
207 quiz.quiz( master, self, username, selectedQuiz.get())
208 ENDFUNCTION
209
210 FUNCTION logout(self):
211 menuFrame.destroy()
212 mainApp.login()
213 ENDFUNCTION
214
215CLASS teacherInterface:
216 FUNCTION __init__(self, master, mainApp):
217 master < - master
218 mainApp < - mainApp
219 master.unbind('<Return>')
220 draw()
221 ENDFUNCTION
222
223 FUNCTION draw(self):
224 master.title('Teacher Menu')
225 menuFrame < - tk.Frame(master)
226 menuFrame.pack()
227 createQuizButton < - tk.Button(menuFrame, text='Create Quiz', command=createQuiz)
228 manageStudentsButton < - tk.Button(menuFrame, text='Manage Students', command=manageStudents)
229 createQuizButton.grid(column=0, row=0)
230 manageStudentsButton.grid(column=0, row=1)
231 logOutButton < - tk.Button(menuFrame, text='Log Out', command=logOut)
232 logOutButton.grid(column=0, row=2)
233 ENDFUNCTION
234
235 FUNCTION createQuiz(self):
236 menuFrame.destroy()
237 master.title('Create Quiz')
238 createQuizFrame < - tk.Frame(master)
239 createQuizFrame.pack()
240 quizNameLabel < - tk.Label(createQuizFrame, text='Quiz Name: ')
241 quizNameLabel.grid(column=0, row=0)
242 quizNameEntry < - tk.Entry(createQuizFrame)
243 quizNameEntry.grid(column=1, row=0)
244 startQuestionCreationButton < - tk.Button(createQuizFrame, text='Start Question Creation', command=createQuestions)
245 startQuestionCreationButton.grid(columnspan=2, column=0, row=1)
246 backButton < - tk.Button(createQuizFrame, text='Back', command=lambda: back(createQuizFrame, draw))
247 backButton.grid(column=0, row=2)
248 ENDFUNCTION
249
250 FUNCTION back(self, originFrame, destinationFunction):
251 originFrame.destroy()
252 destinationFunction()
253 ENDFUNCTION
254
255 FUNCTION logOut(self):
256 menuFrame.destroy()
257 mainApp.login()
258 ENDFUNCTION
259
260 FUNCTION createQuestions(self):
261 quizName < - quizNameEntry.get()
262 createQuizFrame.destroy()
263 createQuestionFrame < - tk.Frame(master)
264 createQuestionFrame.pack()
265 conn < - sqlite3.connect('questionDb.db')
266 c < - conn.cursor()
267 c.execute(
268 "CREATE TABLE IF NOT EXISTS %s (ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, questionText TEXT NOT NULL, answer1 TEXT NOT NULL, answer2 TEXT NOT NULL, answer3 TEXT NOT NULL, answer4 TEXT NOT NULL, correctAnswerNo INTEGER NOT NULL)" % quizName)
269 conn.commit()
270 conn2 < - sqlite3.connect('results.db')
271 c2 < - conn2.cursor()
272 c2.execute("CREATE TABLE IF NOT EXISTS %s (username TEXT NOT NULL PRIMARY KEY, score INTEGER NOT NULL)" % quizName)
273 conn2.commit()
274 questionTextLabel < - tk.Label(createQuestionFrame, text='Question')
275 questionNumberValue < - tk.IntVar(createQuestionFrame)
276 questionNumberValue.set(1)
277 questionNumberLabel < - tk.Label(createQuestionFrame, textvariable=questionNumberValue)
278 totalQuestionLabel < - tk.Label(createQuestionFrame, text='/20')
279 questionText2Label < - tk.Label(createQuestionFrame, text='Question:')
280 questionTextEntry < - tk.Entry(createQuestionFrame, width=64)
281 answerTextLabel < - tk.Label(createQuestionFrame, text='Answers:')
282 correctAnswerLabel < - tk.Label(createQuestionFrame, text='Correct Answer')
283 oneLabel < - tk.Label(createQuestionFrame, text='1')
284 twoLabel < - tk.Label(createQuestionFrame, text='2')
285 threeLabel < - tk.Label(createQuestionFrame, text='3')
286 fourLabel < - tk.Label(createQuestionFrame, text='4')
287 answer1Entry < - tk.Entry(createQuestionFrame)
288 answer2Entry < - tk.Entry(createQuestionFrame)
289 answer3Entry < - tk.Entry(createQuestionFrame)
290 answer4Entry < - tk.Entry(createQuestionFrame)
291 correctAnswerNo < - tk.IntVar()
292 correctAnswerNo.set(5)
293 answer1Radiobutton < - tk.Radiobutton(createQuestionFrame, variable=correctAnswerNo, value=1)
294 answer2Radiobutton < - tk.Radiobutton(createQuestionFrame, variable=correctAnswerNo, value=2)
295 answer3Radiobutton < - tk.Radiobutton(createQuestionFrame, variable=correctAnswerNo, value=3)
296 answer4Radiobutton < - tk.Radiobutton(createQuestionFrame, variable=correctAnswerNo, value=4)
297 blankRadiobutton < - tk.Radiobutton(createQuestionFrame, variable=correctAnswerNo, value=5)
298 nextQuestionButton < - tk.Button(createQuestionFrame, text='Next Question', command=addQuestion)
299 answerSelected < - tk.StringVar(createQuestionFrame)
300 answerSelected.set('')
301 selectedAnswerLabel < - tk.Label(createQuestionFrame, textvariable=answerSelected)
302 questionTextLabel.grid(column=0, row=0)
303 questionNumberLabel.grid(column=1, row=0, sticky='E')
304 totalQuestionLabel.grid(column=2, row=0, sticky='W')
305 questionText2Label.grid(column=0, row=1)
306 questionTextEntry.grid(column=1, row=1, columnspan=4)
307 answerTextLabel.grid(column=0, row=2)
308 correctAnswerLabel.grid(column=4, row=2)
309 oneLabel.grid(column=1, row=3)
310 twoLabel.grid(column=1, row=4)
311 threeLabel.grid(column=1, row=5)
312 fourLabel.grid(column=1, row=6)
313 answer1Entry.grid(column=2, row=3, columnspan=2)
314 answer2Entry.grid(column=2, row=4, columnspan=2)
315 answer3Entry.grid(column=2, row=5, columnspan=2)
316 answer4Entry.grid(column=2, row=6, columnspan=2)
317 answer1Radiobutton.grid(column=4, row=3)
318 answer2Radiobutton.grid(column=4, row=4)
319 answer3Radiobutton.grid(column=4, row=5)
320 answer4Radiobutton.grid(column=4, row=6)
321 nextQuestionButton.grid(column=1, row=7, columnspan=3)
322 selectedAnswerLabel.grid(column=1, row=8, columnspan=3)
323 ENDFUNCTION
324
325 FUNCTION addQuestion(self):
326 questionText < - questionTextEntry.get()
327 answer1Text < - answer1Entry.get()
328 answer2Text < - answer2Entry.get()
329 answer3Text < - answer3Entry.get()
330 answer4Text < - answer4Entry.get()
331 correctAnswerNo < - correctAnswerNo.get()
332 IF correctAnswerNo != 5:
333 c.execute('INSERT INTO %s (questionText, answer1, answer2, answer3, answer4, correctAnswerNo) VALUES (?,?,?,?,?,?)' % quizName,
334 (questionText, answer1Text, answer2Text, answer3Text, answer4Text, correctAnswerNo))
335 conn.commit()
336 IF questionNumberValue.get() < 20:
337 questionNumberValue.set(questionNumberValue.get() + 1)
338 questionTextEntry.delete(0, tk.END)
339 answer1Entry.delete(0, tk.END)
340 answer2Entry.delete(0, tk.END)
341 answer3Entry.delete(0, tk.END)
342 answer4Entry.delete(0, tk.END)
343 blankRadiobutton.invoke()
344 answerSelected.set('')
345 ELSE:
346 back(createQuestionFrame, draw)
347 ENDIF
348 ELSE:
349 answerSelected.set('Please select a correct answer')
350 ENDIF
351 ENDFUNCTION
352
353 FUNCTION manageStudents(self):
354 menuFrame.destroy()
355 manageStudentsFrame < - tk.Frame(master)
356 manageStudentsFrame.pack()
357 master.title('Manage Students')
358 changeStudentPasswordButton < - tk.Button(manageStudentsFrame, text='Change Student Password',
359 command=changeStudentPassword)
360 editStudentsButton < - tk.Button(manageStudentsFrame, text='Edit Students', command=editStudents)
361 createStudentButton < - tk.Button(manageStudentsFrame, text='Create Student', command=createStudent)
362 viewStudentResultsButton < - tk.Button(manageStudentsFrame, text='View Student Results', command=viewStudentResults)
363 backButton < - tk.Button(manageStudentsFrame, text='Back', command=lambda: back(manageStudentsFrame, draw))
364 changeStudentPasswordButton.grid(column=1, row=0)
365 editStudentsButton.grid(column=1, row=1)
366 createStudentButton.grid(column=1, row=2)
367 viewStudentResultsButton.grid(column=1, row=3)
368 backButton.grid(column=0, row=4)
369 ENDFUNCTION
370
371 FUNCTION changeStudentPassword(self):
372 manageStudentsFrame.destroy()
373 master.title('Change Student Password')
374 changeStudentPasswordFrame = tk.Frame(master)
375 changeStudentPasswordFrame.pack()
376 conn < - sqlite3.connect('quiz.db')
377 c < - conn.cursor()
378 studentUsernameEntry = tk.Entry(changeStudentPasswordFrame)
379 passwordEntry = tk.Entry(changeStudentPasswordFrame, state='disabled')
380 backButton = tk.Button(changeStudentPasswordFrame, text='Back',
381 command=lambda: back(changeStudentPasswordFrame, manageStudents))
382 studentUsernameLabel = tk.Label(changeStudentPasswordFrame, text='Student Username: ')
383 studentFoundLabelText = tk.StringVar()
384 studentFoundLabel = tk.Label(changeStudentPasswordFrame, textvariable=studentFoundLabelText)
385 passwordLabel = tk.Label(changeStudentPasswordFrame, text='Password: ')
386 searchButton = tk.Button(changeStudentPasswordFrame, text='Search',
387 command=lambda: changeStudentPasswordUserSearch(studentUsernameEntry.get(), c))
388 updateButton = tk.Button(changeStudentPasswordFrame, text='Update', state='disabled',
389 command=lambda: updatePassword(studentUsernameEntry.get(), c, conn))
390 studentUsernameLabel.grid(column=0, row=0)
391 studentUsernameEntry.grid(column=1, row=0)
392 searchButton.grid(columnspan=2, column=0, row=1)
393 studentFoundLabel.grid(columnspan=2, column=0, row=2)
394 passwordLabel.grid(column=0, row=3)
395 passwordEntry.grid(column=1, row=3)
396 updateButton.grid(columnspan=2, column=0, row=4)
397 backButton.grid(column=2, row=4)
398 ENDFUNCTION
399
400 FUNCTION changeStudentPasswordUserSearch(self, username, cursor):
401 cursor.execute('SELECT username FROM slogin WHERE username=?', (username,))
402 results < - cursor.fetchall()
403 IF len(results) = 0:
404 studentFoundLabelText.set('Student Not Found')
405 updateButton.configure(state='disabled')
406 passwordEntry.configure(state='disabled')
407 ELSE:
408 studentFoundLabelText.set('Student Found')
409 updateButton.configure(state='normal')
410 passwordEntry.configure(state='normal')
411 ENDIF
412 ENDFUNCTION
413
414 FUNCTION updatePassword(self, username, cursor, connection):
415 cursor.execute('UPDATE slogin SET password=? WHERE username=?', (passwordEntry.get(), username))
416 connection.commit()
417 back(changeStudentPasswordFrame, manageStudents)
418 ENDFUNCTION
419
420 FUNCTION editStudents(self):
421 manageStudentsFrame.destroy()
422 master.title('Edit Students')
423 editStudentsFrame = tk.Frame(master)
424 editStudentsFrame.pack()
425 forenameLabel = tk.Label(editStudentsFrame, text='Forename: ')
426 surnameLabel = tk.Label(editStudentsFrame, text='Surname: ')
427 forenameEntry = tk.Entry(editStudentsFrame)
428 surnameEntry = tk.Entry(editStudentsFrame)
429 searchButton = tk.Button(editStudentsFrame, text='Search',
430 command=lambda: editStudentSearch(forenameEntry.get(), surnameEntry.get()))
431 backButton = tk.Button(editStudentsFrame, text='Back', command=lambda: back(editStudentsFrame, manageStudents))
432 forenameLabel.grid(column=0, row=1)
433 surnameLabel.grid(column=0, row=2)
434 forenameEntry.grid(column=1, row=1)
435 surnameEntry.grid(column=1, row=2)
436 searchButton.grid(columnspan=2, column=0, row=3)
437 backButton.grid(column=2, row=3)
438 ENDFUNCTION
439
440 FUNCTION
441 editStudentSearch(self, forename, surname):
442 username < - forename + '.' + surname
443 conn < - sqlite3.connect('quiz.db')
444 cursor < - conn.cursor()
445 IF len(forename) > 0 AND len(surname) > 0:
446 cursor.execute('SELECT forename, surname FROM slogin WHERE username LIKE ?', ('%' + username + '%',))
447 results < - cursor.fetchall()
448 OUTPUT
449 results
450 displayEditStudentSearch(results)
451 ELSEIF len(forename) > 0 AND len(surname) = 0:
452 cursor.execute('SELECT forename, surname FROM slogin WHERE username LIKE ?', (username + '%',))
453 results < - cursor.fetchall()
454 displayEditStudentSearch(results)
455 ELSEIF len(forename) = 0 AND len(surname) > 0:
456 cursor.execute('SELECT forename, surname FROM slogin WHERE username LIKE ?', ('%' + username,))
457 results < - cursor.fetchall()
458 displayEditStudentSearch(results)
459 ENDIF
460 conn.close()
461 ENDFUNCTION
462
463 FUNCTION displayEditStudentSearch(self, data):
464 editStudentsFrame.destroy()
465 editStudentsFrame2 < - tk.Frame(master)
466 editStudentsFrame2.pack()
467 forenameListbox < - tk.Listbox(editStudentsFrame2)
468 surnameListbox < - tk.Listbox(editStudentsFrame2)
469 forenameLabel < - tk.Label(editStudentsFrame2, text='Forename')
470 surnameLabel < - tk.Label(editStudentsFrame2, text='Surname')
471 editButton < - tk.Button(editStudentsFrame2, text='Edit',
472 command=lambda: editStudentButton(forenameListbox, surnameListbox))
473 backButton < - tk.Button(editStudentsFrame2, text='Back', command=lambda: back(editStudentsFrame2, editStudents))
474 forenameListbox.grid(column=0, row=1)
475 surnameListbox.grid(column=1, row=1)
476 forenameLabel.grid(column=0, row=0)
477 surnameLabel.grid(column=1, row=0)
478 editButton.grid(column=2, row=1)
479 backButton.grid(column=2, row=2)
480 for i in data:
481 forenameListbox.insert(tk.END, i[0])
482 surnameListbox.insert(tk.END, i[1])
483 ENDFOR
484 ENDFUNCTION
485
486 FUNCTION editStudentButton(self, f, s):
487 IF f.curselection() = ():
488 x < - s.curselection()
489 ELSE:
490 x < - f.curselection()
491 ENDIF
492 forename < - f.get(x)
493 surname < - s.get(x)
494 editStudentsFrame2.destroy()
495 editStudentsFrame3 < - tk.Frame(master)
496 editStudentsFrame3.pack()
497 forenameLabel < - tk.Label(editStudentsFrame3, text='Forename:')
498 surnameLabel < - tk.Label(editStudentsFrame3, text='Surname:')
499 saveButton < - tk.Button(editStudentsFrame3, text='Save',
500 command=lambda: editStudentSave(forenameEntry.get(), surnameEntry.get(),
501 forename + '.' + surname))
502 backButton < - tk.Button(editStudentsFrame3, text='Back', command=lambda: back(editStudentsFrame3, editStudents))
503 forenameEntry < - tk.Entry(editStudentsFrame3)
504 surnameEntry < - tk.Entry(editStudentsFrame3)
505 forenameLabel.grid(column=0, row=0)
506 surnameLabel.grid(column=0, row=1)
507 forenameEntry.grid(column=1, row=0)
508 surnameEntry.grid(column=1, row=1)
509 saveButton.grid(column=0, row=2, columnspan=2)
510 backButton.grid(column=0, row=3, columnspan=2)
511 ENDFUNCTION
512
513 FUNCTION editStudentSave(self, forename, surname, username):
514 conn < - sqlite3.connect('quiz.db')
515 cursor < - conn.cursor()
516 cursor.execute('UPDATE slogin SET username <- ?, forename <- ?, surname <- ? WHERE username <- ?',
517 (forename + '.' + surname, forename, surname, username))
518 conn.commit()
519 conn.close()
520 back(editStudentsFrame3, editStudents)
521 ENDFUNCTION
522
523 FUNCTION createStudent(self):
524 manageStudentsFrame.destroy()
525 master.title('Create Student')
526 createStudentFrame = tk.Frame(master)
527 createStudentFrame.pack()
528 forenameLabel = tk.Label(createStudentFrame, text='Forename')
529 surnameLabel = tk.Label(createStudentFrame, text='Surname')
530 forenameEntry = tk.Entry(createStudentFrame)
531 surnameEntry = tk.Entry(createStudentFrame)
532 createButton = tk.Button(createStudentFrame, text='Create', state='disabled', command=newStudent)
533 backButton = tk.Button(createStudentFrame, text='Back', command=lambda: back(createStudentFrame, manageStudents))
534 forenameLabel.grid(column=0, row=0)
535 forenameEntry.grid(column=1, row=0)
536 surnameLabel.grid(column=0, row=1)
537 surnameEntry.grid(column=1, row=1)
538 createButton.grid(columnspan=2, column=0, row=2)
539 backButton.grid(column=2, row=2)
540 forenameEntry.bind('<Key>', createButtonChecker)
541 surnameEntry.bind('<Key>', createButtonChecker)
542 ENDFUNCTION
543
544 FUNCTION createButtonChecker(self, e):
545 IF len(forenameEntry.get()) > 0 AND len(surnameEntry.get()) > 0:
546 createButton.configure(state='normal')
547 ELSE:
548 createButton.configure(state='disabled')
549 ENDIF
550 ENDFUNCTION
551
552 FUNCTION newStudent(self, forename, surname):
553 username < - forename + '.' + surname
554 password < - generatePassword()
555 createStudentFrame.destroy()
556 newStudentFrame < - tk.Frame(master)
557 newStudentFrame.pack()
558 conn < - sqlite3.connect('quiz.db')
559 c < - conn.cursor()
560 c.execute('INSERT INTO slogin VALUES (?,?,?,?)', (username, password, forename, surname))
561 conn.commit()
562 conn.close()
563 studentNumberLabel < - tk.Label(newStudentFrame, text='Student Number:')
564 forenameLabel < - tk.Label(newStudentFrame, text='Forename: ')
565 surnameLabel < - tk.Label(newStudentFrame, text='Surname: ')
566 passwordLabel < - tk.Label(newStudentFrame, text='Password: ')
567 exitButton < - tk.Button(newStudentFrame, text='Exit', command=lambda: back(newStudentFrame, manageStudents))
568 studentNumberLabel.grid(column=0, row=0)
569 forenameLabel.grid(column=0, row=1)
570 surnameLabel.grid(column=0, row=2)
571 passwordLabel.grid(column=0, row=3)
572 exitButton.grid(column=1, row=4)
573 ENDFUNCTION
574
575 FUNCTION generatePassword(self):
576 allchar < - string.ascii_letters + string.digits
577 password < - ''.join(choice(allchar) for x in range(random.randint(6, 6)))
578 RETURN password
579 ENDFUNCTION
580
581 FUNCTION viewStudentResults(self):
582 manageStudentsFrame.destroy()
583 master.title('View Student Results')
584 viewResultsFrame = tk.Frame(master)
585 viewResultsFrame.pack()
586 quizLabel = tk.Label(viewResultsFrame, text='Quiz:')
587 viewResultsButton = tk.Button(viewResultsFrame, text='View Results',
588 command=lambda: viewResults(quizListbox.get(quizListbox.curselection())))
589 backButton = tk.Button(viewResultsFrame, text='Back', command=lambda: back(viewResultsFrame, manageStudents))
590 quizListbox = tk.Listbox(viewResultsFrame)
591 quizLabel.grid(column=0, row=0)
592 viewResultsButton.grid(column=1, row=1)
593 backButton.grid(column=1, row=2)
594 quizListbox.grid(column=0, row=1, rowspan=3)
595 conn < - sqlite3.connect('results.db')
596 cursor < - conn.cursor()
597 cursor.execute('SELECT name FROM sqlite_master WHERE type="table"')
598 quizzes < - cursor.fetchall()
599 for i in quizzes:
600 quizListbox.insert(tk.END, i)
601 ENDFOR
602 ENDFUNCTION
603
604 FUNCTION viewResults(self, quiz):
605 viewResultsFrame.destroy()
606 master.title(quiz[0] + ' Results')
607 viewResultsFrame2 < - tk.Frame(master)
608 viewResultsFrame2.pack()
609 studentLabel < - tk.Label(viewResultsFrame2, text='Student')
610 scoreLabel < - tk.Label(viewResultsFrame2, text='Score')
611 studentListbox < - tk.Listbox(viewResultsFrame2)
612 scoreListbox < - tk.Listbox(viewResultsFrame2)
613 backButton < - tk.Button(viewResultsFrame2, text='Back', command=lambda: back(viewResultsFrame2, viewStudentResults))
614 studentLabel.grid(column=0, row=0)
615 scoreLabel.grid(column=1, row=0)
616 studentListbox.grid(column=0, row=1)
617 scoreListbox.grid(column=1, row=1)
618 backButton.grid(column=3, row=0, rowspan=3)
619 conn < - sqlite3.connect('results.db')
620 cursor < - conn.cursor()
621 cursor.execute('SELECT username, score FROM %s' % quiz)
622 results < - cursor.fetchall()
623 for i in results:
624 studentListbox.insert(tk.END, i[0])
625 scoreListbox.insert(tk.END, i[1])
626 ENDFOR
627 ENDFUNCTION
628END CLASS
629
630CLASS quiz:
631 FUNCTION __init__(self, master, mainApp, user, quiz):
632 quizName <- quiz
633 createQuestions()
634 master <- master
635 quizFrame <- tk.Frame( master)
636 quizFrame.pack()
637 score <- tk.IntVar( quizFrame)
638 score.set(0)
639 mainApp <- mainApp
640 username <- user
641 draw()
642 submit()
643 ENDFUNCTION
644
645 FUNCTION createQuestions(self):
646 questions <- []
647 conn <- sqlite3.connect('questionDb.db')
648 c <- conn.cursor()
649 currentQuestionIndex <- 0
650 for i in range(20):
651 c.execute('SELECT * FROM %s WHERE ID="%s"'%( quizName,i+1)) #not insecure bc kids are thick AND user doesnt alter input
652 questionData <- c.fetchall()
653 questionNo <- questionData[0][0]
654 questionText <- questionData[0][1]
655 answer1 <- questionData[0][2]
656 answer2 <- questionData[0][3]
657 answer3 <- questionData[0][4]
658 answer4 <- questionData[0][5]
659 correctAnswerNo <- questionData[0][6]
660 questions.append([ questionNo, questionText, answer1, answer2, self.answer3, self.answer4, self.correctAnswerNo])
661 ENDFOR
662 conn.close()
663 ENDFUNCTION
664
665 FUNCTION draw(self):
666 no <- tk.IntVar( quizFrame)
667 questionTextVar <- tk.StringVar( quizFrame)
668 answer1TextVar <- tk.StringVar( quizFrame)
669 answer2TextVar <- tk.StringVar( quizFrame)
670 answer3TextVar <- tk.StringVar( quizFrame)
671 answer4TextVar <- tk.StringVar( quizFrame)
672 questionLabel <- tk.Label( quizFrame, text='Question ')
673 questionNumberLabel <- tk.Label( quizFrame, textvariable= no)
674 currentQuestionLabel <- tk.Label( quizFrame, textvariable= questionTextVar)
675 selectedAnswer <- tk.IntVar( quizFrame)
676 answer1Rb <- tk.Radiobutton( quizFrame, textvariable= answer1TextVar, variable= selectedAnswer, value=1)
677 answer2Rb <- tk.Radiobutton( quizFrame, textvariable= answer2TextVar, variable= selectedAnswer, value=2)
678 answer3Rb <- tk.Radiobutton( quizFrame, textvariable= answer3TextVar, variable= selectedAnswer, value=3)
679 answer4Rb <- tk.Radiobutton( quizFrame, textvariable= answer4TextVar, variable= selectedAnswer, value=4)
680 blankRb <- tk.Radiobutton( quizFrame, variable= selectedAnswer, value=5)
681 blankRb.invoke()
682 selectAnswerText <- tk.StringVar( quizFrame)
683 selectAnswerText.set('')
684 answerNotSelectedLabel <- tk.Label( quizFrame, textvariable= selectAnswerText)
685 submitButton <- tk.Button( quizFrame, text='Submit', command= submit)
686 scoreTextLabel <- tk.Label( quizFrame, text='Current Score: ')
687 scoreLabel <- tk.Label( quizFrame, textvariable= score)
688 questionLabel.grid(column=0, row=0)
689 questionNumberLabel.grid(column=2, row=0)
690 currentQuestionLabel.grid(column=0, row=1, columnspan=4)
691 answer1Rb.grid(column=0, row=2)
692 answer2Rb.grid(column=1, row=2)
693 answer3Rb.grid(column=2, row=2)
694 answer4Rb.grid(column=3, row=2)
695 submitButton.grid(column=0, row=3, columnspan=4)
696 scoreLabel.grid(column=4, row=0)
697 scoreTextLabel.grid(column=3, row=0)
698 answerNotSelectedLabel.grid(column=1, row=4, columnspan=4)
699 ENDFUNCTION
700
701 FUNCTION changeQuestion(self, number, question, answer1, answer2, answer3, answer4):
702 no.set(number)
703 questionTextVar.set(question)
704 answer1TextVar.set(answer1)
705 answer2TextVar.set(answer2)
706 answer3TextVar.set(answer3)
707 answer4TextVar.set(answer4)
708 blankRb.invoke()
709 ENDFUNCTION
710
711 FUNCTION submit(self):
712 IF selectedAnswer.get() != 5:
713 selectAnswerText.set('')
714 IF currentQuestionIndex = 0:
715 current <- questions[ currentQuestionIndex]
716 changeQuestion( current[0], current[1], current[2], current[3], self.current[4], self.current[5])
717 currentQuestionIndex += 1
718 ELSEIF currentQuestionIndex > 0 AND currentQuestionIndex < 20:
719 IF selectedAnswer.get() = current[6]:
720 incrementIntVar( score)
721 ENDIF
722 current <- questions[ currentQuestionIndex]
723 changeQuestion( current[0], current[1], current[2], current[3], self.current[4], self.current[5])
724 currentQuestionIndex += 1
725 ELSE:
726 IF selectedAnswer.get() = current[6]:
727 incrementIntVar( score)
728 ENDIF
729 writeScore()
730 closeQuiz()
731 ENDIF
732 ELSE:
733 selectAnswerText.set('Select an answer!')
734 ENDIF
735 ENDFUNCTION
736
737 FUNCTION incrementIntVar(self, intvar):
738 intvar.set(intvar.get()+1)
739 ENDFUNCTION
740
741 FUNCTION writeScore(self):
742 conn2 <- sqlite3.connect('results.db')
743 c2 <- conn2.cursor()
744 OUTPUT '1'
745 OUTPUT username
746 try:
747 OUTPUT quizName, username, score
748 c2.execute('INSERT INTO %s VALUES (?, ?)'% quizName, ( username, score.get()))
749 OUTPUT 2
750 except sqlite3.IntegrityError:
751 c2.execute('UPDATE %s SET score= ? WHERE username= ?'% quizName, ( score.get(), username))
752 OUTPUT 3
753 conn2.commit()
754 conn2.close()
755 OUTPUT 'close'
756 ENDFUNCTION
757
758 FUNCTION closeQuiz(self):
759 quizFrame.destroy()
760 mainApp.drawInterface()
761 ENDFUNCTION
762
763start()