ccpq/standalone_tui.py

101 lines
2.8 KiB
Python
Raw Normal View History

2021-05-23 16:04:09 +02:00
#!/usr/bin/python3
import pathlib
import time
import os
import csv
import random
from rich.console import Console
from rich.markdown import Markdown
from ccpq.lib_ccpq import Question, Database, Game
class Tui(object):
def __init__(self):
self._console = Console()
self._stats = []
def ask_question(self, question):
md = Markdown("# {}".format(question.get_question()))
self._console.print(md)
md = ""
for possibility in question.get_possibilities():
md += "1. {}\n".format(possibility)
md = Markdown(md)
self._console.print(md)
def prompt_for_answer(self):
md = Markdown("What's your answer?")
self._console.print(md)
answer = self._parse_input()
return answer
def _parse_input(self):
"""
TODO make it adapt to questions with multiple choices and fill the
blank
"""
while True:
result = input()
if result.isdigit():
return result
md = Markdown("**only digits please**")
self._console.print(md)
def show_response(self, question):
answers = question.get_right_answers()
if len(answers) == 1:
answer = answers[0]
md = Markdown("### The right answer is: {}".format(answer))
else:
md = "### The right answers are:\n"
for answer in answers:
md += "* {}\n".format(answer)
md = Markdown(md)
self._console.print(md)
def show_stats(self, stats):
md = "### you have {} out of {} right!".format(stats[0], stats[2])
md = Markdown(md)
self._console.print(md)
md = "### press **enter** to get a new question or **CTRL-C** to quit"
md = Markdown(md)
self._console.print(md)
input()
os.system("clear")
def goodbye(self):
md = Markdown("# Goodbye!")
self._console.print(md)
class Application(object):
def __init__(self, filepath, interface):
self._db = Database(filepath)
self._session = Game()
self._interface = interface
def run(self):
while True:
question = self._db.get_question()
self._interface.ask_question(question)
answer = self._interface.prompt_for_answer()
stat = question.verify(answer)
self._session.update_stats(stat)
self._interface.show_response(question)
self._interface.show_stats(self._session.get_stats())
def quit(self):
self._interface.goodbye()
if __name__ == "__main__":
filepath = pathlib.Path("./data/list_book1.csv")
interface = Tui()
app = Application(filepath, interface)
try:
app.run()
except KeyboardInterrupt:
app.quit()