Python Forum
[tkinter] Quiz generator
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[tkinter] Quiz generator
#1
To run this from command line: python3 quiz_generator.py trivia01.txt
if the text file isn't in the same folder the full path is used.
quiz_generator.py:
import tkinter as tk
from functools import partial
import logging, sys
from time import time,sleep,localtime
import argparse
parser= argparse.ArgumentParser(description='This script takes a formatted .txt \
and feeds into a tkinter display, push one button to advance the test. Usage: \
python3 script_name.py quiz_01.txt')
parser.add_argument('dirPath', help='A formatted .txt file directory path')
args= parser.parse_args()
                                
logging.basicConfig(level= logging.DEBUG)
#logging.disable(logging.CRITICAL)

class First_Multiple_Guess(tk.Frame):
    """Simple trivia game: a question with 4 buttons as answers, pick any
       one to advance to the next question.
       Usage: python3 script.py trivia01.txt
       the text file needs to be formatted:
       1. Question line?
       A. answer one
       B. answer 2
       C. answer 3
       D. None of the above
       D
       """
       
    def __init__(self, file_path, parent=None):
        # create widgets and base attributes
        self.filePath= file_path
        self.parent= parent
        self.parent.title('My trivia game')
        tk.Frame.__init__(self, self.parent)
        self.pack(expand='yes',fill='both')       
        self.canvas= tk.Canvas(self)
        self.canvas.config(width= 1500, height= 700, bg='skyblue',
                           scrollregion=(0,0,3000,3000))
        xbar= tk.Scrollbar(self, orient='horizontal',)        
        xbar.config(command= self.canvas.xview)        
        self.canvas.config(yscrollcommand= xbar.set)                           
        xbar.pack(side='bottom',fill='x',padx=2,pady=2)
        self.canvas.pack(expand=True, fill=tk.BOTH)        
        self.font= ('monospace',18,'bold')
        self.questions= []
        self.answers= []
        self.solutions= []        
        self.count =0
        self.question_var= tk.StringVar()
        self.solution_var= tk.StringVar()
        self.win_var= tk.IntVar()
        self.loss_var= tk.IntVar()
        self.win_static= tk.Label(self.canvas, text='Wins')
        self.win_static.place(x=1300,y=130)
        self.loss_static= tk.Label(self.canvas, text='Loss')
        self.loss_static.place(x=1400,y=130)
        self.quest_label= tk.Label(self.canvas, textvariable= self.question_var,
                                font=self.font)
        self.quest_label.place(x=25,y=15)
        self.sol_label= tk.Label(self.canvas, textvariable= self.solution_var,
                              font=self.font)
        self.sol_label.place(x=50,y=420)       
        self.win_label= tk.Label(self.canvas, textvariable= self.win_var,
                                 font= self.font)
        self.win_label.place(x=1300,y=200)
        self.loss_label= tk.Label(self.canvas, textvariable= self.loss_var,
                                  font= self.font)
        self.loss_label.place(x=1400,y=200)        
        self.g_count=0
        self.a_count= 0
        self.win_count= 0
        self.loss_count=0
        self.total_count=0
        self.open_file()
    def open_file(self):
        """Pulling out the information from the file and
        store it in 3 lists"""
        count =0
        with open(self.filePath, 'r') as file:
            line= file.readline()
            while line:
                if count == 0:
                    self.questions.append(line)
                    count +=1                   
                    line= file.readline()
                elif count == 5:
                    self.solutions.append(line)
                    count = 0                    
                    line= file.readline()
                else:                    
                    self.answers.append(line)
                    count +=1
                    line= file.readline()
        self.length_quest= len(self.questions)
        self.build_puzzle()

    def build_puzzle(self):
        '''Build and place label and 4 buttons use for loop to
           step through a list answers. Partial funtion to assign the solution
           to each button.''' 
        #main loop 
        self.solution_var.set('')
        picks= ['A','B','C','D']
        y2= 60
        quest= self.questions[self.count]
        self.question_var.set(quest)
        self.frame= tk.Frame(self.parent,width=1200,height=360,
                             bg='skyblue')
        self.frame.place(x=50,y=50)
        
        for i in picks:
            answer= self.answers[self.a_count]
            self.btn= tk.Button(self.frame, text=answer,
                                command=partial(self.check_ans, i),
                                 font=self.font)
            self.btn.place(x=40,y=y2)
            y2 += 80
            self.a_count +=1
    def check_ans(self, letter):
        """Comparing the solution to the answer,
           and keep track of wins and losses,
           check for last question."""
        sol= self.solutions[self.count]        
        if sol.strip() == letter:
            self.total_count +=1
            self.win_count +=1
            self.win_var.set(self.win_count)
            if self.total_count == self.length_quest:
                text= 'Correct answers: {:.2%}'.format(self.win_count/self.total_count)
                self.frame.place_forget()
                self.solution_var.set(text)
                self.question_var.set(' ')
            else:
            
                self.frame.place_forget()
                self.solution_var.set(f'Winning answer: {letter}')
                self.question_var.set(' ')
                self.count +=1
                self.canvas.after(2000, self.build_puzzle)
            
        else:
            self.total_count +=1
            self.loss_count +=1
            self.loss_var.set(self.loss_count)
            if self.total_count == self.length_quest:
                text= 'Correct answer: {:.2%}'.format(self.win_count/self.total_count)
                self.frame.place_forget()
                self.solution_var.set(text)
                self.question_var.set(' ')
            else:
                text= f'You picked {letter} and that is incorrect'
                self.frame.place_forget()
                self.solution_var.set(text)
                self.question_var.set(' ')
                self.count +=1
                self.canvas.after(2000, self.build_puzzle)

if __name__ == '__main__':
    dirPath= args.dirPath
    root= tk.Tk()
    First_Multiple_Guess(dirPath, root)
    root.mainloop()
trivia01.txt:
1. How do crickets hear?
a. Through their wings
b. Through their belly
c. Through their knees
d. Through their tongue
C
2. Which American city invented plastic vomit?
a. Chicago
b. Detroit
c. Columbus
d. Baltimore
A
3. In ‘Ben Hur’, which modern thing can be seen during the chariot scene?
a. A waitress
b. A car
c. A postbox
d. A street lamp
B
4. What was Karl Marx’s favorite color?
a. Brown
b. Blue
c. Red
d. Purple
C
5. What’s the best way to stop crying while peeling onions?
a. Lick almonds
b. Suck lemons
c. Eat cheese
d. Chew gum
D
6. How old was the youngest Pope?
a. 11
b. 17
c. 22
d. 29
A
7. Which animal sleeps for only five minutes a day?
a. A chameleon
b. A koala
c. A giraffe
d. A beaver
C
8. How many words in the English language end in “dous"?
a. Two
b. Four
c. Six
d. Eight
B
9. One human hair can support how many kilograms?
a. Three
b. Five
c. Seven
d. Nine
A
10. The bikini was originally called the what?
a. Poke
b. Range
c. Half
d. Atom
D
11. Which European city is home to the Fairy Investigation Society?
a. Poznan
b. Dublin
c. Bratislava
d. Tallinn
B
12. What’s a frog’s favorite color?
a. Blue
b. Orange
c. Yellow
d. Brown
A
13. Which one of these planets rotates clockwise?
a. Uranus
b. Mercury
c. Pluto
d. Venus
D
14. What perspires half a pint of fluid a day?
a. Your scalp
b. Your armpits
c. Your feet
d. Your buttocks
C
15. St Stephen is the patron saint of who?
a. Plumbers
b. Bricklayers
c. Roofers
d. Carpenters
B
16. Which country leads the world in cork production?
a. Greece
b. Australia
c. Spain
d. Mexico
C
17. On average, what do you do 15 times a day?
a. Laugh
b. Burp
c. Break wind
d. Lick your lips
A
18. What color was Coca-Cola originally?
a. Red
b. Purple
c. Beige
d. Green
D
19. Bubble gum contains what?
a. Plastic
b. Calcium
c. Rubber
d. Pepper
C
20. The inventor of the paint roller was of which nationality?
a. Hungarian
b. Canadian
c. Norwegian
d. Argentinian
B
Reply


Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020