Classes

Secção dedicada à linguagem de programação favorita dos quarkianos: Python!

Classes

Mensagempor Drizzel em Quinta Dez 23, 2010 1:06 am

Saudações a todos! Espero bem não estar a criar um tópico repetido, mas após uma passagem de olhos "diagonal" pela secção "Pitónica" pareceu-me que não... :D
Tenho uma dúvida relacionada com classes na qual preciso de algumas luzes. Qualquer ideia é bem-vinda! Consiste no seguinte: estou a tentar criar um "menu" recorrendo a classes. A ideia será que quando inicio o programa seja "lida" uma classe onde consta um texto explicativo (o meu "menu", por assim dizer) e, consoante a inserção de um dos vários comandos de texto discriminados nesse mesmo texto explicativo, se chame uma classe que faz as acções a que o comando de texto se refere. No entanto, independentemente da classe chamada pelo comando de texto, quero ter sempre a possibilidade de voltar ao "menu" inicial, ou seja, de voltar ao texto explicativo inicial e poder inserir qualquer um dos outros comandos de texto disponíveis. O meu problema reside precisamente em fazer isso. Não vejo como voltar ao menu inicial.
Inicialmente ponderei em colocar uma condição em que se verificasse o seguinte: se o input do utilizador for, por exemplo, "Menu", então chama-se a classe inicial (o meu "menu"); no entanto não acho que funcione no meu caso, uma vez que isto seria para implementar numa calculadora: os operadores algébricos estão sobrecarregados e, portanto, não há um input passível de ser verificado pela condição que mencionei (com os operadores sobrecarregados o input do utilizador será sempre uma expressão algébrica (por exemplo, 3+5) e não está associado a uma função input() ou raw_input(), pelo que não posso aplicar uma condição como a que mencionei). De momento estou bloqueado neste problema e por isso procuro alguma ajuda! Espero que a exposição do problema não esteja demasiado confusa.

Aproveito também para desejar um Feliz Natal e Boas Entradas a todos os Quarkianos! :xD:
Failure? Sorry, nerver heard of such.
Avatar do utilizador
Drizzel
bottom-Quark!
bottom-Quark!
 
Mensagens: 67
Registado: Segunda Fev 25, 2008 2:45 pm
Localização: Braga

Re: Classes

Mensagempor jap em Segunda Dez 27, 2010 8:52 am

Olá,

Retribuo os votos de Boas Festas! :xD:

Fiquei um bocado confuso com a descrição do teu problema. :?

Construir dinâmicamente menus em Python é fácil, recorrendo, p. ex., ao Tkinter. Fazer uma calculadora em Python é um problema clássico, nas "Bíblias" do Python tens vários exemplos.

Não sei bem como ajudar, porque não percebi bem o teu problema. Para a questão de criação de menus dinâmicos, as classes do TkInter devem resolver o problema.... :roll:

PS: O Tkinter permite realizar menus estilo "interface gráfica", não sei bem se é isso que pretendes... :roll:
José António Paixão
Departamento de Física da FCTUC
Avatar do utilizador
jap
Site Admin
Site Admin
 
Mensagens: 6790
Registado: Quinta Nov 09, 2006 9:34 pm
Localização: Univ. de Coimbra

Re: Classes

Mensagempor Drizzel em Segunda Dez 27, 2010 12:12 pm

Olá professor,

Eu já suspeitava que tinha confundido mais do que esclarecido! :oops:

Eu não pretendia um menu do estilo interface gráfica. O que eu pretendia era o seguinte: ao iniciar a calculadora seria apresentado um texto do estilo:

"Calculadora iniciada. 'Cálculos' para operações matemáticas básicas. 'Ajuda' para explicações sobre o funcionamento da calculadora."

Ao introduzir 'Cálculos' acedia-se à funcionalidade de operações matemáticas básicas: soma, subtracção, multiplicação, divisão, entre outros. No entanto, eu quero que dentro desta funcionalidade, se eu introduzir, por exemplo, "Menu", volte a:

"Calculadora iniciada. 'Cálculos' para operações matemáticas básicas. 'Ajuda' para explicações sobre o funcionamento da calculadora."

Era isto que eu queria dizer por "voltar ao menu inicial". O meu problema reside em fazer isto na funcionalidade 'Cálculos'; uma vez que serão feitas operações matemáticas o input do utilizador será sempre uma expressão matemática (por exemplo, 3+5). Não sendo texto não vejo como posso testar se o input foi "Menu" ou não. Provavelmente a minha única hipótese é testar cada input que o utilizador vai metendo, certo?

Espero ter sido esclarecedor agora... :oops:
Failure? Sorry, nerver heard of such.
Avatar do utilizador
Drizzel
bottom-Quark!
bottom-Quark!
 
Mensagens: 67
Registado: Segunda Fev 25, 2008 2:45 pm
Localização: Braga

Re: Classes

Mensagempor Tharis em Segunda Dez 27, 2010 2:21 pm

Não respondi mais cedo porque também não tinha percebido bem (mesmo agora não sei se já percebo bem).

Algo do género não resolve o teu problema?

Código: Seleccionar Todos
def calculos():
    while True:
        s = raw_input()
        if s == "Menu":
            return
        print eval(s)

def menu():
    while True:
        s = raw_input()
        if s == "Sair":
            exit()
        elif s == "Calculos":
            calculos()
Avatar do utilizador
Tharis
up-Quark!
up-Quark!
 
Mensagens: 387
Registado: Quinta Out 23, 2008 4:26 pm

Re: Classes

Mensagempor Drizzel em Terça Dez 28, 2010 11:21 pm

Viva! Só agora tive oportunidade de vir ao fórum e só agora vi a tua sugestão Tharis.

Entretanto estive em experimentação e consegui resolver o problema (embora não da forma que sugeres). Um simples try resolve o meu problema todo... :lol:

Código: Seleccionar Todos
try:
       w=input("Introduza a operação a realizar: ")
       print "O resultado e ",w
       trivial()
except:
       menu()


trivial () é a classe de cálculos; menu() é o menu. :lol:

Como input() só aceita números quando tento meter uma string dá erro. Assim, o try verifica se input() dá erro ou não (o que ocorre caso eu lá ponha "Menu") e se der, volta a menu(); se não der sei que está lá uma expressão e simplesmente faz os cálculos. :D
Claro que o try dará erro não apenas quando ponho "Menu" no input(), mas quando lá coloco uma string qualquer. No entanto vou aproveitar isso em meu favor para o resto do programa. :D
Em qualquer dos casos obrigado pela ajuda! :wink:
Failure? Sorry, nerver heard of such.
Avatar do utilizador
Drizzel
bottom-Quark!
bottom-Quark!
 
Mensagens: 67
Registado: Segunda Fev 25, 2008 2:45 pm
Localização: Braga

Re: Classes

Mensagempor Tharis em Quarta Dez 29, 2010 10:20 pm

Só um reparo. O input() não dá sempre erro quando metes alguma coisa que não seja um número.

Código: Seleccionar Todos
>>> x = 5
>>> input()
a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'a' is not defined
>>> input()
x
5
>>>



Good luck ;)
Avatar do utilizador
Tharis
up-Quark!
up-Quark!
 
Mensagens: 387
Registado: Quinta Out 23, 2008 4:26 pm

Re: Classes

Mensagempor Drizzel em Quarta Dez 29, 2010 11:43 pm

Bem visto! :D No entanto não há problema no meu caso. Construí esta parte do código de modo que, quando o input() é apresentado, se realize uma conta (com valores concretos e sem incógnitas) ou apenas se volte ao menu anterior. Não faria sentido colocar algo como o que sugeriste; apenas poderia ser colocado se o utilizador se enganasse, mas vou ter fé de que isso não ocorrerá! :lol: Seja como for, tendo tempo no fim, resolverei essa questão em vez de ter fé no utilizador.

Mais uma vez obrigado pela ajuda! :D
Failure? Sorry, nerver heard of such.
Avatar do utilizador
Drizzel
bottom-Quark!
bottom-Quark!
 
Mensagens: 67
Registado: Segunda Fev 25, 2008 2:45 pm
Localização: Braga


Voltar para Pitónica

Quem está ligado

Utilizadores a navegar neste fórum: Nenhum utilizador registado e 1 visitante

cron