
Potrebbe avere qualche bug, è poco commentata e il codice potrebbe essere molto poco comprensibile.
L'ho scritta con la filosofia "basta che funziona", quindi non vi impressionate
Se vi dovesse interessare potrei continuarne lo sviluppo
Sono ben accetti i commenti
import e32
import appuifw
import key_codes as key
calc = []
result = u''
FONT = ('normal', 22)
x = 5
shift = False
ht = 40 # altezza tasto
wt = 55 # larghezza tasto
keyboard = u'123456789S0,'
keyboard_s = u'sin,cos,tan,sqrt,^2,^-1,log,*10^,exp,S,pi,ANS'.split(',')
KEY = ('normal', 20)
JOYP = (200, 110)
JOYP_FONT = ('normal', 20)
JOY_W = 20
JOY_H = 20
JOY_C = (0, 200, 200)
RED = (200, 0 ,0)
def draw(r=None):
global shift, x
c.clear((0, 0, 0))
# Background
c.rectangle((0, 0, c.size[0], 55), fill = (0, 200, 200))
# Numeri
k = 0
for row in range(4):
for col in range(3):
rect = (wt*col, 65+ht*row, wt*col+wt, 65+ht*row+ht)
c.rectangle(rect, fill = (255,255,255), outline=(0,0,0))
if shift:
if row == 3 and col == 0:
c.rectangle(rect, fill = (255,0,0), outline=(0,0,0))
tasto = (wt*col+wt/2-c.measure_text(keyboard_s[k], font = KEY)[1]/2, 65+ht*row+30)
c.text(tasto, keyboard_s[k], font = KEY)
else:
tasto = (wt*col+wt/2-c.measure_text(keyboard[k], font = KEY)[1]/2, 65+ht*row+30)
c.text(tasto, keyboard[k], font = KEY)
k += 1
# Display
box = c.measure_text(u'%s =' % ''.join(calc), font = FONT)
x = min(max(20-box[1], x), 5)
c.text((x, 20), u'%s =' % ''.join(calc), font = FONT)
c.text((5, 45), result, font = FONT)
# Joypad
c.ellipse((JOYP[0]-JOY_W-10,
JOYP[1]-JOY_H-20,
JOYP[0]+JOY_W+20,
JOYP[1]+JOY_H+5),
fill = JOY_C)
if shift:
c.text((JOYP[0], JOYP[1]-JOY_H), u'(', font = JOYP_FONT, fill = RED)
c.text((JOYP[0], JOYP[1]+JOY_H), u')', font = JOYP_FONT, fill = RED)
c.text((JOYP[0]+JOY_W, JOYP[1]), u'>', font = JOYP_FONT, fill = RED)
c.text((JOYP[0]-JOY_W, JOYP[1]), u'<', font = JOYP_FONT, fill = RED)
else:
c.text((JOYP[0], JOYP[1]-JOY_H), u'+', font = JOYP_FONT, fill = RED)
c.text((JOYP[0], JOYP[1]+JOY_H), u'-', font = JOYP_FONT, fill = RED)
c.text((JOYP[0]+JOY_W, JOYP[1]), u'*', font = JOYP_FONT, fill = RED)
c.text((JOYP[0]-JOY_W, JOYP[1]), u'/', font = JOYP_FONT, fill = RED)
c.text(JOYP, u'=', font = JOYP_FONT, fill = RED)
def key_handler(event):
global calc, result, shift, x
# Funzioni SHIFT
if shift == True:
if event['keycode'] == key.EKeyUpArrow:
calc.append(u'(')
if event['keycode'] == key.EKeyDownArrow:
calc.append(u')')
if event['keycode'] == key.EKeyStar:
shift = False
if event['keycode'] == key.EKeyHash:
calc = [result]
shift = False
if event['keycode'] == key.EKeyRightArrow:
x -= 15
if event['keycode'] == key.EKeyLeftArrow:
x += 15
if event['keycode'] == key.EKey0:
calc.append(u'pi')
if event['keycode'] == key.EKey1:
calc.append(u'sin(')
if event['keycode'] == key.EKey2:
calc.append(u'cos(')
if event['keycode'] == key.EKey3:
calc.append(u'tan(')
if event['keycode'] == key.EKey4:
calc.append(u'sqrt(')
if event['keycode'] == key.EKey5:
calc.append(u'**2')
if event['keycode'] == key.EKey6:
calc.append(u'**(-1)')
if event['keycode'] == key.EKey7:
calc.append(u'log(')
if event['keycode'] == key.EKey8:
calc.append(u'*10**(')
if event['keycode'] == key.EKey9:
calc.append(u'exp(')
# Funzioni non SHIFT
else:
if event['keycode'] == key.EKeyStar:
shift = True
if event['keycode'] == key.EKeyUpArrow:
calc.append(u'+')
if event['keycode'] == key.EKeyDownArrow:
calc.append(u'-')
if event['keycode'] == key.EKeyRightArrow:
calc.append(u'*')
if event['keycode'] == key.EKeyLeftArrow:
calc.append(u'/')
if event['keycode'] == key.EKeyHash:
calc[-1] += u'.'
if event['keycode'] == key.EKeyStar:
shift = True
if event['keycode'] in range(key.EKey0, key.EKey9+1):
try:
float(calc[-1])
calc[-1] += u'%s' % (event['keycode'] - key.EKey0)
except:
calc.append(u'%s' % (event['keycode'] - key.EKey0))
# Funzioni globali
if event['keycode'] == key.EKeySelect:
temp = []
for c in calc:
try:
float(c)
temp.append('float(%s)' % c)
except:
temp.append(c)
try:
result = str(eval(''.join(temp))).decode('utf-8')
except:
result = u'Errore di sintassi!'
if event['keycode'] == key.EKeyBackspace:
if calc:
if len(calc[-1]) > 1:
calc[-1] = calc[-1][:-1]
else:
calc.pop()
draw()
def clear():
global calc, result
calc = []
result = u''
#lock.signal()
c = appuifw.Canvas(event_callback=key_handler, redraw_callback=draw)
appuifw.app.body = c
appuifw.app.exit_key_handler = clear
lock = e32.Ao_lock()
lock.wait()

Aiuto












Pubblicità