Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion app/calculador.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

# @autor: Matheus Felipe
# @github: github.com/matheusfelipeog
import math # Import math to enable log() function support

class Calculador(object):
"""Classe responsável por realizar todos os calculos da calculadora"""
Expand All @@ -17,7 +18,7 @@ def __calculation_validation(self, calc):
"""Responsável por verificar se o calculo informado é possível ser feito"""

try:
result = eval(calc)
result = eval(calc, {"log": math.log})

return self.__format_result(result=result)
except (NameError, ZeroDivisionError, SyntaxError, ValueError):
Expand Down
48 changes: 28 additions & 20 deletions app/calculadora.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,13 @@
class Calculadora(object):
"""Classe para criação do layout da calculadora, distribuição dos botões
e a adição de suas funcionalidades.

Os botões distríbuidos no layout estão conforme o exemplo abaixo:

C | ( | ) | <
7 | 8 | 9 | x
4 | 5 | 6 | -
1 | 2 | 3 | +
. | 0 | = | /
| | ^ | √

OBS: É necessário importar o modulo style contido na pacote view,
e selecionar uma de suas classes de estilo.
"""
Expand Down Expand Up @@ -171,8 +168,9 @@ def _create_buttons(self, master):
self._BTN_DOT = tk.Button(master, text='.', cnf=self.theme['BTN_DEFAULT'])

# Instânciação dos botões vazios, para futura implementação
self._BTN_VAZIO1 = tk.Button(master, text='', cnf=self.theme['BTN_OPERADOR'])
self._BTN_VAZIO2 = tk.Button(master, text='', cnf=self.theme['BTN_OPERADOR'])
# --- ORIGINAL, PERO AQUÍ LOS REMPLAZAMOS ---
self._BTN_VAZIO1 = tk.Button(master, text='%', cnf=self.theme['BTN_OPERADOR']) # <<< AQUÍ
self._BTN_VAZIO2 = tk.Button(master, text='log', cnf=self.theme['BTN_OPERADOR']) # <<< AQUÍ

# Distribuição dos botões em um gerenciador de layout grid
# Linha 0
Expand Down Expand Up @@ -205,9 +203,9 @@ def _create_buttons(self, master):
self._BTN_RESULT.grid(row=4, column=2, padx=1, pady=1)
self._BTN_DIV.grid(row=4, column=3, padx=1, pady=1)

# Linha 5
self._BTN_VAZIO1.grid(row=5, column=0, padx=1, pady=1)
self._BTN_VAZIO2.grid(row=5, column=1, padx=1, pady=1)
# Linha 5 (espacios vacíos)
self._BTN_VAZIO1.grid(row=5, column=0, padx=1, pady=1) # %
self._BTN_VAZIO2.grid(row=5, column=1, padx=1, pady=1) # log
self._BTN_EXP.grid(row=5, column=2, padx=1, pady=1)
self._BTN_RAIZ.grid(row=5, column=3, padx=1, pady=1)

Expand All @@ -231,15 +229,19 @@ def _create_buttons(self, master):
self._BTN_EXP['command'] = partial(self._set_operator_in_input, '**')
self._BTN_RAIZ['command'] = partial(self._set_operator_in_input, '**(1/2)')

# --- EVENTOS NUEVOS ---
self._BTN_VAZIO1['command'] = partial(self._set_operator_in_input, '%')
self._BTN_VAZIO2['command'] = partial(self._set_operator_in_input, 'log(')

# Eventos dos botões de funcionalidades da calculadora
# Eventos dos botões de funcionalidades
self._BTN_DOT['command'] = partial(self._set_dot_in_input, '.')
self._BTN_ABRE_PARENTESE['command'] = self._set_open_parent
self._BTN_FECHA_PARENTESE['command'] = self._set_close_parent
self._BTN_DEL['command'] = self._del_last_value_in_input
self._BTN_CLEAR['command'] = self._clear_input
self._BTN_RESULT['command'] = self._get_data_in_input


def _set_values_in_input(self, value):
"""Metódo responsável por captar o valor númerico clicado e setar no input"""
if self._entrada.get() == 'Erro':
Expand Down Expand Up @@ -302,31 +304,37 @@ def _set_operator_in_input(self, operator):
return

if self._entrada.get() == '':
# print('\33[91mOperação inválida.\33[m')
return
# Evita casos de operadores repetidos sequêncialmente, para evitar erros

if operator == 'log(':
if self._entrada.get() == '0':
self._entrada.delete(0, len(self._entrada.get()))
self._entrada.insert(0, 'log(')

else:
if self._entrada.get()[-1] in '+-*/(' and self._lenght_max(self._entrada.get()):
self._entrada.insert(len(self._entrada.get()), 'log(')
return

# Evita operadores repetidos
if self._entrada.get()[-1] not in '+-*/' and self._lenght_max(self._entrada.get()):
self._entrada.insert(len(self._entrada.get()) ,operator)
self._entrada.insert(len(self._entrada.get()), operator)

def _get_data_in_input(self):
"""Pega os dados com todas as operações contidos dentro do input
para realizar o calculo"""
"""Pega os dados com todas as operações contidos dentro do input"""
if self._entrada.get() == 'Erro':
return

result = self.calc.calculation(self._entrada.get())
self._set_result_in_input(result=result)

def _set_result_in_input(self, result=0):
"""Seta o resultado de toda a operação dentro do input"""
if self._entrada.get() == 'Erro':
return

"""Seta o resultado dentro do input"""
self._entrada.delete(0, len(self._entrada.get()))
self._entrada.insert(0, result)

def _lenght_max(self, data_in_input):
"""Para verificar se o input atingiu a quantidade de caracteres máxima"""
"""Verifica o limite de caracteres"""
if len(str(data_in_input)) >= 15:
return False
return True
Expand All @@ -337,7 +345,7 @@ def start(self):

def _realod_app(self):
"""Reinicia o aplicativo."""
python = sys.executable # Recupera o path do executável do python
python = sys.executable
os.execl(python, python, * sys.argv)

def _exit(self):
Expand Down