Apr-05-2019, 05:47 PM
Ok,
Looks like all is working, so here's the code, and a final screenshot.
You should be able to take control from here and make any modifications you need.
Play with it, if you mess it up, no problem, you can always come back here and start over.
code:
Looks like all is working, so here's the code, and a final screenshot.
You should be able to take control from here and make any modifications you need.
Play with it, if you mess it up, no problem, you can always come back here and start over.
code:
import tkinter as tk import tkinter.ttk as ttk import sqlite3 import os from pathlib import Path import sys class QuizGui: def __init__(self, parent, title='Generic Title'): # create directory anchor os.chdir(os.path.abspath(os.path.dirname(__file__))) homepath = Path('.') datadir = homepath / 'QuestionsDatabase' self.database = datadir / 'Questions.db' self.parent = parent self.dbcon = None self.db_connect() self.question = None self.choices = None self.answer = None self.current_question = 1 self.question_text = tk.StringVar() self.rb_control = tk.StringVar() self.rb_control.set('A') self.rb = {} self.youranswer = tk.StringVar() self.youranswer.set('Please make choice, press select when ready') self.rbval = [] self.parent.geometry('600x400+50+50') self.parent.title(title) self.build_gui() def build_gui(self): frame1 = tk.Frame(self.parent, bd=5, relief=tk.SUNKEN, padx=5, pady=5) frame1.pack(fill=tk.BOTH) qlabel = tk.Label(frame1, textvariable=self.question_text) qlabel.pack(anchor='w') self.get_next_question() self.question_text.set(f'{self.current_question} {self.question}') rb = self.rb = {} for n, choice in enumerate(self.choices): rb[n] = {} rb[n]['txt'] = tk.StringVar() rb[n]['txt'].set(f'{choice[0]} {choice[1]}') rb[n]['val'] = tk.StringVar() rb[n]['widget'] = tk.Radiobutton(frame1, textvariable=rb[n]['txt'], padx=5, variable=self.rb_control, value=n) rb[n]['widget'].pack(anchor='w') frame2 = tk.Frame(frame1, height=5, bg='gray', padx=10, pady=10, relief=tk.RAISED) frame2.pack(fill=tk.BOTH) btn1 = tk.Button(frame1, text='Select', bd=2, relief=tk.RAISED, padx=5, pady=5, width=25, command=self.ChoiceMade) btn1.pack(anchor='w') btn2 = tk.Button(frame1, text='Next Question', bd=2, relief=tk.RAISED, padx=5, pady=5, width=25, command=self.set_next_question) btn2.pack(anchor='w') btn3 = tk.Button(frame1, text='Quit', bd=2, relief=tk.RAISED, padx=5, pady=5, width=25, command=self.quit) btn3.pack(anchor='w') frame3 = tk.Frame(frame1, height=5, bg='gray', padx=10, pady=10, relief=tk.RAISED) frame3.pack(fill=tk.BOTH) response = tk.Label(frame1, textvariable=self.youranswer) response.pack(anchor='w') def set_next_question(self): self.current_question += 1 self.get_next_question() self.question_text.set(f'{self.current_question} {self.question}') for n, choice in enumerate(self.choices): self.rb[n]['txt'].set(f'{choice[0]} {choice[1]}') def get_next_question(self): question_number = self.current_question self.question, self.choices, self.answer = self.get_current_question() self.question_text.set(self.question) def ChoiceMade(self): item_index = int(self.rb_control.get()) if self.choices[item_index][0] == self.answer: self.youranswer.set('Correct Answer') else: self.youranswer.set('Sorry Wrong Answer') def db_connect(self): try: self.dbcon = sqlite3.connect(self.database) except sqlite3.Error as e: print(e) def get_current_question(self): question_number = self.current_question qsql = f''' SELECT Question FROM Questions WHERE QuestionId = '{question_number}' ''' csql = f''' SELECT SeqLetter, Choice FROM Choices WHERE QuestionId = '{question_number}' ORDER BY SeqLetter ''' asql = f''' SELECT Answer FROM Answers WHERE QuestionId = '{question_number}' ''' try: cursor = self.dbcon.cursor() cursor.execute(qsql) question = cursor.fetchone()[0] choices = [] cursor.execute(csql) while True: choice = cursor.fetchmany() if not len(choice): break choices.append(list(choice[0])) cursor.execute(asql) answer = cursor.fetchone()[0] return question, choices, answer except TypeError: print(f'Invalid question_number {question_number}') def quit(self): self.db_close() self.parent.destroy() sys.exit(0) def db_close(self): self.dbcon.close() if __name__ == '__main__': root = tk.Tk() QuizGui(root, title='Quiz Program') root.mainloop()Final screenshot: