-
Notifications
You must be signed in to change notification settings - Fork 0
/
kalkulacka.py
executable file
·120 lines (102 loc) · 3.17 KB
/
kalkulacka.py
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/usr/bin/python
# -*- coding: utf8 -*-
# Soubor: kalkulacka.py
# Datum: 20.11.2012 13:11
# Autor: Marek Nožka, nozka <@t> spseol <d.t> cz
# Licence: GNU/GPL
# Úloha: grafická kalkulačka s reverzní notací
####################################################
import sys, cmath, math
from sys import stdin, stdout, stderr
from Tkinter import *
import cmath # počítání s komplexními čísly
####################################################
def exit(event=None):
sys.exit(0)
stack = []
# vloží do zásobníku a do Listboxu číslo
def push(item):
if item == 'pi':
item = item.replace('pi','3.141592653589793')
item = item.replace('e','2.718281828459045')
try:
if item.count(',')==1:
num = item.split(',')
stack.append( float(num[0]) + float(num[1])*1j )
box.insert(END, str(stack[-1]))
return True
elif item.count('(')==1:
num = item.split('(')
stack.append( float(num[0]) * cmath.exp( float(num[1])*1j ) )
box.insert(END, str(stack[-1]))
return True
else:
stack.append(complex(item))
box.insert(END, str(item))
return True
except EOFError:
return False
def pop():
box.delete(END)
return stack.pop()
# hlavní funkce, ktrá provádí požadovanou akci
def goo(event=None):
line = edt.get() # vezmu celý uživatelský vstup
items = line.split() # rozdělím ho na jednotlivé položky
edt.delete(0,END) # vymažu vstupní pole
for token in items:
if token == '+':
a = pop()
b = pop()
push(a+b)
elif token == '*':
a = pop()
b = pop()
push(a*b)
elif token == '/':
a = pop()
b = pop()
push(b/a)
elif token == '-':
a = pop()
b = pop()
push(b-a)
elif token == 'log':
a = pop()
push(cmath.log10(a))
elif token == 'ln':
a = pop()
push(cmath.log(a))
elif token == 'pi':
push(cmath.pi)
elif token == 'e':
push(cmath.e)
else:
if push(token):
lblMsg.config(text="OK", fg='black')
else:
lblMsg.config(text="Chyba", fg='red')
err = token + token.join( line.split(token)[1:] )
edt.delete(0,END)
edt.insert(0,err)
edt.icursor(0)
edt.selection_from(0)
edt.selection_to(len(token))
break
####################################################
mainWin = Tk(className="foo")
mainWin.title("Kalkulacka")
mainWin.option_add('*Font', 'Terminus 16')
# při stisku Esc se aplikace zavře
mainWin.bind("<Escape>",exit)
lbl = Label(mainWin, text=u"Kalkulačka s reverzní notací")
lbl.pack()
box = Listbox(mainWin, width=20, height=10)
box.pack()
lblMsg = Label(mainWin, text=u"...")
lblMsg.pack()
edt = Entry(mainWin, width=20)
edt.pack()
edt.bind("<Return>", goo)
edt.focus_set() # vyberu vstupní pole a můžu hned psát
mainWin.mainloop()