Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from Tkinter import *
- from time import sleep
- import random, linecache, winsound, tkMessageBox
- class QuizGUI:
- def __init__(self, parent):
- ### Make parent remember itself:
- self.myParent = parent
- self.initialize()
- def nextQuestion(self):
- if (self.questionNum+6) >= self.numberOfLines:
- pass
- else:
- self.questionNum += 6
- print "Question: %s"% self.questionNum
- self.updateDisplay()
- def previousQuestion(self):
- if self.questionNum > 1:
- self.questionNum -= 6
- if self.questionNum <= 1:
- self.questionNum = 1
- print "Question: %s"% self.questionNum
- self.updateDisplay()
- def addQuestion(self):
- self.boolAdd = TRUE
- ### Unlock the entry boxes, lock "NEXT", "PREVIOUS", "EDIT":
- self.bEdit["state"] = "disabled"
- self.bNext["state"] = "disabled"
- self.bPrev["state"] = "disabled"
- for self.each in self.eAnswerChoices:
- self.each["state"] = "normal"
- self.each.delete(0,END)
- self.eQuestion["state"] = "normal"
- self.eQuestion.delete(0, END)
- for self.each in self.rAnswerChoices:
- self.each["state"] = "normal"
- def editQuestion(self):
- self.boolEdit = TRUE
- ### Unlock the entry boxes, lock "NEXT", "PREVIOUS", "ADD NEW":
- self.bAdd["state"] = "disabled"
- self.bNext["state"] = "disabled"
- self.bPrev["state"] = "disabled"
- for self.each in self.eAnswerChoices:
- self.each["state"] = "normal"
- self.eQuestion["state"] = "normal"
- for self.each in self.rAnswerChoices:
- self.each["state"] = "normal"
- def deleteQuestion(self):
- ### Read the question num, and delete from questionNum to it's correctAnswer
- del self.quizList[self.questionNum-1:self.questionNum+5]
- self.rewriteInformation()
- tkMessageBox.showinfo("Question Deleted", "Question has been deleted;\nRestart the program to see changes")
- def saveQuestion(self):
- ### Save all the visible information:
- self.numberOfLines = 0
- if self.rVariable.get() == 0:
- self.correctAnswer = "A"
- if self.rVariable.get() == 1:
- self.correctAnswer = "B"
- if self.rVariable.get() == 2:
- self.correctAnswer = "C"
- if self.rVariable.get() == 3:
- self.correctAnswer = "D"
- print self.correctAnswer
- if self.boolEdit == TRUE:
- ### Now, go to <quesitonNumber> in the <quizFile[questionNum]>, and rewrite!
- self.quizList[self.questionNum-1] = self.eQuestion.get()
- self.quizList[self.questionNum] = self.eAnswerChoiceA.get()
- self.quizList[self.questionNum+1] = self.eAnswerChoiceB.get()
- self.quizList[self.questionNum+2] = self.eAnswerChoiceC.get()
- self.quizList[self.questionNum+3] = self.eAnswerChoiceD.get()
- self.quizList[self.questionNum+4] = self.correctAnswer
- if self.boolAdd == TRUE:
- self.quizList.append(self.eQuestion.get())
- self.quizList.append(self.eAnswerChoiceA.get())
- self.quizList.append(self.eAnswerChoiceB.get())
- self.quizList.append(self.eAnswerChoiceC.get())
- self.quizList.append(self.eAnswerChoiceD.get())
- self.quizList.append(self.correctAnswer)
- self.rewriteInformation()
- self.updateDisplay()
- tkMessageBox.showinfo("Question Updated", "Infomation has been updated; \nRestart the program to see changes.")
- print "MESSAGEBOX SHOWN!!!!"
- self.updateDisplay()
- def rewriteInformation(self):
- self.quizList2 = []
- for self.each in self.quizList:
- self.item = (self.each + "\n")
- self.quizList2.append(self.item)
- #Rewrite the quiz file!
- self.quizFile = open(self.quizLoc, 'w')
- for each in self.quizList2:
- self.quizFile.write(each)
- self.quizFile.flush()
- self.quizFile.close()
- print self.quizList2
- def getInformation(self):
- # Read the quiz file!
- self.quizLoc = "qtquest.dat"
- self.quizFile = open(self.quizLoc, 'r')
- self.quizList = []
- for line in self.quizFile:
- item = line.rstrip("\n")
- self.quizList.append(item)
- self.numberOfLines+=1
- self.quizFile.close()
- def updateDisplay(self):
- print "UpdateDisplay's self.quizList: %s" %self.quizList
- ### GET the question, answers and correct answer from the file using linecache, and the question number:
- self.questionText = str(linecache.getline(self.quizLoc, self.questionNum)).rstrip() #Remove all whitespace to the right of the question, and force it to be a string.
- self.answerAText = str(linecache.getline(self.quizLoc, self.questionNum+1)).rstrip()
- self.answerBText = str(linecache.getline(self.quizLoc, self.questionNum+2)).rstrip()
- self.answerCText = str(linecache.getline(self.quizLoc, self.questionNum+3)).rstrip()
- self.answerDText = str(linecache.getline(self.quizLoc, self.questionNum+4)).rstrip()
- self.correctAnswer= str(linecache.getline(self.quizLoc, self.questionNum+5)).rstrip()
- print self.questionText
- print self.answerAText
- print self.answerBText
- print self.answerCText
- print self.answerDText
- print self.correctAnswer
- print self.correctAnswerNum
- #Translate correctAnswer's ABCD to 0123:
- if self.correctAnswer.upper() == "A":
- self.correctAnswerNum = 0
- if self.correctAnswer.upper() == "B":
- self.correctAnswerNum = 1
- if self.correctAnswer.upper() == "C":
- self.correctAnswerNum = 2
- if self.correctAnswer.upper() == "D":
- self.correctAnswerNum = 3
- ### Update all the entry boxes based on the variables from getInformation():
- self.eQuestion["state"] = "normal"
- self.eQuestion.delete(0, END)
- self.eQuestion.insert(0, self.questionText)
- self.eQuestion["state"] = "disabled"
- print self.eQuestion.get()
- answerLetter = 0
- for self.each in self.eAnswerChoices:
- self.each["state"] = "normal"
- self.each.delete(0, END)
- if answerLetter == 0:
- self.each.insert(0, self.answerAText)
- if answerLetter == 1:
- self.each.insert(0, self.answerBText)
- if answerLetter == 2:
- self.each.insert(0, self.answerCText)
- if answerLetter == 3:
- self.each.insert(0, self.answerDText)
- self.each["state"] = "disabled"
- answerLetter += 1
- self.rVariable.set( self.correctAnswerNum)
- print "self.rVariable: %s"%self.rVariable
- for self.each in self.rAnswerChoices:
- self.each["state"] = "normal"
- self.each["variable"] = self.rVariable
- self.each["state"] = "disabled"
- if self.boolEdit == FALSE:
- self.bNext["state"] = "normal"
- self.bPrev["state"] = "normal"
- self.bAdd["state"] = "normal"
- if self.boolAdd == FALSE:
- self.bNext["state"] = "normal"
- self.bPrev["state"] = "normal"
- self.bAdd["state"] = "normal"
- def initialize(self):
- ### Create the main container:
- self.mainContainer = Frame(self.myParent)
- self.mainContainer.pack()
- ### Internal Variables:
- self.correctAnswerNum = 0
- self.rVariable = IntVar()
- self.eAnswerChoices = []
- self.rAnswerChoices = []
- self.numberOfLines = 0
- self.questionNum = 1
- self.boolEdit = FALSE
- self.boolAdd = FALSE
- #--------------------------------------------------------------------------------------------------
- ### Create the "Question" Entry box (Initially Disabled), with the "Question" Label and Number:
- lQuestion = Label(self.mainContainer, text="Current Question:").grid(row=0,column=0)
- self.eQuestion = Entry(self.mainContainer, width=75,)
- self.eQuestion.grid(row=0,column=1,columnspan=3)
- ### Create the "Answer" Entry Boxes (Initially Disabled), with "Answer" labels and both Radio boxes
- ### in the following format: [A] [QUESTION] ( ). The radio box'd answer is the correct answer.
- lAnswerChar = Label(self.mainContainer, text="Answer Letter:").grid(row=2,column=0)
- lAnswerChoice = Label(self.mainContainer, text="Possible Answers:").grid(row=2,column=1)
- lAnswerCorrect = Label(self.mainContainer, text="Correct Answer:").grid(row=2, column=2)
- lAnswerCharA = Label(self.mainContainer, text="A").grid(row=3,column=0)
- lAnswerCharB = Label(self.mainContainer, text="B").grid(row=4,column=0)
- lAnswerCharC = Label(self.mainContainer, text="C").grid(row=5,column=0)
- lAnswerCharD = Label(self.mainContainer, text="D").grid(row=6,column=0)
- self.eAnswerChoiceA = Entry(self.mainContainer, width=50)
- self.eAnswerChoiceB = Entry(self.mainContainer, width=50)
- self.eAnswerChoiceC = Entry(self.mainContainer, width=50)
- self.eAnswerChoiceD = Entry(self.mainContainer, width=50)
- self.eAnswerChoices.append(self.eAnswerChoiceA)
- self.eAnswerChoices.append(self.eAnswerChoiceB)
- self.eAnswerChoices.append(self.eAnswerChoiceC)
- self.eAnswerChoices.append(self.eAnswerChoiceD)
- self.rAnswerChoiceA = Radiobutton(self.mainContainer, variable=self.rVariable, value=0)
- self.rAnswerChoiceB = Radiobutton(self.mainContainer, variable=self.rVariable, value=1)
- self.rAnswerChoiceC = Radiobutton(self.mainContainer, variable=self.rVariable, value=2)
- self.rAnswerChoiceD = Radiobutton(self.mainContainer, variable=self.rVariable, value=3)
- self.rAnswerChoices.append(self.rAnswerChoiceA)
- self.rAnswerChoices.append(self.rAnswerChoiceB)
- self.rAnswerChoices.append(self.rAnswerChoiceC)
- self.rAnswerChoices.append(self.rAnswerChoiceD)
- #--------------------------------------------------------------------------------------------------
- ### Pack the Radiobuttons
- currRow = 3
- for each in self.rAnswerChoices:
- each.grid(row=currRow,column=2)
- currRow += 1
- ### Pack the AnswerChoices
- currRow = 3
- for each in self.eAnswerChoices:
- each.grid(row=currRow,column=1)
- currRow += 1
- #--------------------------------------------------------------------------------------------------
- ### Create the buttons: NEXT, PREV, ADD, EDIT, DELETE, SAVE
- self.bPrev = Button(self.mainContainer, text="Previous Question",command=self.previousQuestion,)
- self.bNext = Button(self.mainContainer, text="Next Question",command=self.nextQuestion,)
- self.bAdd = Button(self.mainContainer, text="Add New", command=self.addQuestion,)
- self.bEdit = Button(self.mainContainer, text="Edit Current", command=self.editQuestion,)
- self.bSave = Button(self.mainContainer, text="Save Changes", command=self.saveQuestion,)
- self.bDelete = Button(self.mainContainer, text="Delete Question", command=self.deleteQuestion)
- self.bPrev.grid(row=7, column=0)
- self.bNext.grid(row=7, column=2)
- self.bAdd.grid(row=8, column=0)
- self.bEdit.grid(row=8, column=1)
- self.bSave.grid(row=8, column=2)
- self.bDelete.grid(row=8, column=3)
- #--------------------------------------------------------------------------------------------------
- ### Set all the local Quiz Variables:
- self.getInformation()
- ### At the end, update the display:
- self.updateDisplay()
- root = Tk()
- myapp = QuizGUI(root)
- root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment