1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
# -*- coding: utf-8 -*-
from functions import contain, collect_digits, make_line, make_input
from functions import make_line_remainder, make_input_remainder
class Exercise:
"""This is the base class for the individual exercises.
An exercise is characterized by a topic. A topic determines the
fields of the settings self._sett and public methods of Exercise.
The values of self._sett may vary from exercise to exercise.
"""
def __init__(self):
""" An Exercise stores data on evaluation, i.e date, duration TODO.
The preliminary format deals with errors only and is
[(None, errors), (settings, errors)], where None indicates,
that the settings are not changed by the Learner,
and settings indicates updates done by the Learner.
The list allows to append the current errors to the previous ones,
and even to do an Exercise subsequently several times;
thus the most recent errors are at the end of the list. """
self._eval = []
""" The settings determine the generation of calculations.
The fields of the settings are determined by self._sett['topic'];
the values of the settings are different for different Exercises.
self._sett['calclines'] determines the # of lines in a calculation."""
self._sett = None
""" Calculations are generated according to the settings. """
self._calcs = None
""" An Exercise needs the Display for updating the settings"""
self._display = None
def get_setting(self):
return self._sett
def update_setting(self, sett):
""" Update the settings and generate calculations accordingly. """
self._sett = sett
self._calcs = self._generate_calcs()
def get_calcs(self):
""" Get all calculations generated by the current settings. """
return self._calcs
def get_next_calc(self):
""" Get the next calculation from the Exercise.
TODO.WN091123: handle exception after last exercise. """
return (self._calcs).pop()
def count(self):
""" Return the number of calculations generated by
the current settings """
return len(self._calcs)
#===== methods of subclasses different for topic-specific settings
def format(self, calc):
""" Prepare the representation of a calculation for Display.
This method is public for eventual use on calculations
coming through the net (TODO cooperative games, etc)"""
pass
def _generate_calcs(self):
""" Generate calculations according to topic-specific settings.
Called on each call of update_setting"""
pass
def define_buttons(self):
""" Define buttons for update settings including callbacks.
The widgets are local to exerc-instances and attached to the display:
# self.butt.connect('toggled',self.butt_callback)
# self._display.settings_table.attach(self.butt, 1,2,3,4)
And the callbacks run locally, but read and write in the display:
# def butt_callback(self, widget)
# if widget.get_active():
# self._display._sett['+'] = True
"""
pass
def set_buttons(self, sett):
""" Display buttons according to the current setting sett. """
pass
#===== methods is used by more than one subclass
def format_addsub_simp(self, (calc, linepos)):
""" Prepare the representation of a calculation for Display
on 1 line. Used within several subclasses. """
#@print('in Display.format_addsub_simp: calc=', (calc, linepos))#@
_ccs = collect_digits(calc)
#print('in Exercise.format_addsub_simp: _ccs=',_ccs )
_l0 = make_line(_ccs, linepos)
_ip = make_input(_ccs, linepos)
#@print('in Display.format_addsub_simp: return=', ([_l0], _ip)) #@
return ([_l0], _ip)
#return ([[' ', '1', '0', ' ', '-', ' ', '7', ' ', '=', ' ', '_', ' ']], [(0, 10, '3', ' 10 - 7 = _ ', ' 10 - 7 = 3 ', [' ', '1', '0', ' ', '-', ' ', '7', ' ', '=', ' ', '3', ' '])])
|