import source # Access the source
source.main() # and execute main.
####################
# source/__init__.py
####################
import tkinter, time, os, sys, test.support
import xml.sax._exceptions
from tkinter import Label, Frame, LabelFrame, Entry, Button
from tkinter.filedialog import askopenfilename
from tkinter.messagebox import showinfo, showwarning, showerror
from . import exe_queue, gui_logs, splash, teach_me, testbank
################################################################################
def main():
with test.support.captured_output('stderr') as stderr:
tkinter.NoDefaultRoot()
root = tkinter.Tk()
with splash.Splash(root, 'images//QuizMe Logo.gif', 3):
# Set up the root window.
root.title('QuizMe 2.5')
root.resizable(False, False)
root.wm_iconbitmap(default='images//Icon.ico')
# Create the program GUI.
application = QuizMe(root)
application.grid()
mainloop(root)
cleanup(stderr)
def mainloop(root):
# Threading Support Experiment
gui_logs.root = exe_queue.Pipe(root)
while True:
try:
root.update()
except:
return
time.sleep(1 / 64)
gui_logs.root.update()
def cleanup(stream):
# Record Any Errors
value = stream.getvalue()
if value:
today = time.asctime()
ruler = '=' * len(today)
stamp = '{1}\n{0}\n{1}\n'.format(today, ruler)
file = open('error.log', 'at')
file.write(stamp)
file.write(value)
file.close()
################################################################################
class QuizMe(Frame):
PROMPT = 'What testbank do you want to open?'
def __init__(self, master):
# Initialize the Frame object.
super().__init__(master)
# Create every opening widget.
self.intro = Label(self, text=self.PROMPT)
self.group = LabelFrame(self, text='Filename')
self.entry = Entry(self.group, width=35)
self.click = Button(self.group, text='Browse ...', command=self.file)
self.enter = Button(self, text='Continue', command=self.start)
# Make Windows entry bindings.
def select_all(event):
event.widget.selection_range(0, tkinter.END)
return 'break'
self.entry.bind('<Control-Key-a>', select_all)
self.entry.bind('<Control-Key-/>', lambda event: 'break')
# Position them in this frame.
options = {'sticky': tkinter.NSEW, 'padx': 5, 'pady': 5}
self.intro.grid(row=0, column=0, **options)
self.group.grid(row=1, column=0, **options)
self.entry.grid(row=0, column=0, **options)
self.click.grid(row=0, column=1, **options)
self.enter.grid(row=2, column=0, **options)
def file(self):
# Find filename for self.entry
options = {'defaultextension': '.xml',
'filetypes': [('All', '*'), ('XML', '.xml')],
'initialdir': os.path.join(os.getcwd(), 'tests'),
'parent': self,
'title': 'Testbank to Open'}
filename = askopenfilename(**options)
if filename:
self.entry.delete(0, tkinter.END)
self.entry.insert(0, filename)
def start(self):
# Validate self.entry and begin
path = self.entry.get()
if os.path.exists(path):
if os.path.isfile(path):
try:
bank = testbank.parse(path)
engine = teach_me.FAQ(bank)
except xml.sax._exceptions.SAXParseException as error:
title = error.getMessage().title()
LN = error.getLineNumber()
CN = error.getColumnNumber()
message = 'Line {}, Column {}'.format(LN, CN)
showerror(title, message, master=self)
except AssertionError as error:
title = 'Validation Error'
message = error.args[0]
showerror(title, message, master=self)
except:
title = 'Error'
message = 'Unknown exception was thrown!'
showerror(title, message, master=self)
else:
self.done = False
self.next_event = iter(engine).__next__
self.after_idle(self.execute_quiz)
else:
title = 'Warning'
message = 'File does not exist.'
showwarning(title, message, master=self)
else:
title = 'Information'
message = 'Path does not exist.'
showinfo(title, message, master=self)
def execute_quiz(self):
# Follow the logic from the last program.
# This will be called to handle an event.
try:
event = self.next_event()
except StopIteration:
assert self.done, 'Final event not processed!'
else:
if isinstance(event, teach_me.Enter):
gui_logs.ShowStatus(self, 'Entering', event, self.execute_quiz)
elif isinstance(event, teach_me.Exit):
gui_logs.ShowStatus(self, 'Exiting', event, self.execute_quiz)
self.last_exit = event.kind
elif isinstance(event, teach_me.Question):
gui_logs. AskQuestion(self, event, self.execute_quiz)
elif isinstance(event, teach_me.Report):
flag = [True]
if self.last_exit == 'Section' and event.wrong:
flag[0] = False
gui_logs.ReviewProblems(self, event, flag)
if flag[0]:
gui_logs.ShowReport(self, event, self.execute_quiz)
if event.final:
title = 'Congratulations!'
message = 'You have finished the test.'
showinfo(title, message, master=self)
self.done = True
else:
title = 'Type Error'
message = repr(event)
showerror(title, message, master=self)
Diff to Previous Revision
--- revision 1 2010-12-31 21:46:06
+++ revision 2 2011-01-09 21:14:04
@@ -4,7 +4,6 @@
####################
# source/__init__.py
####################
-
import tkinter, time, os, sys, test.support
import xml.sax._exceptions