[Resolvido] Python Interface Grafica

Iniciado por kakita, 05 de Fevereiro de 2008, 18:01

tópico anterior - próximo tópico

kakita

boas
estou aprendendo a programar em python sozinho e ainda so tenho 1 dia ou dois de pratica. Hoje resolvi fazer o meu primeiro programinha algo simples como a formula resolvente de equaçoes de segundo grau:

a = int(raw_input('A: '))
b = int(raw_input('B: '))
c = int(raw_input('C: '))
d=b**2-4*a*c
x1=(-b+d**0.5)/(2*a)
x2=(-b-d**0.5)/(2*a)
if d < 0
print 'Impossível'
else
print 'Discriminante', d
print "X1=", x1
print 'X2=', x2


ele dá erro em 'if d < 0 '
se tirar isso ele funciona bem mas quando d e menor que zero aparece um outro erro e keria que aparecesse essa mensagem
penso que seja de facil resoluçao mas ainda sou muito noob em python

alessandro_ufms

#1
É que está faltando ':' na frente do if e do else. Também corrigi o código para que ele calcule o x1 e o x2 só quando tiver certeza que o 'd' (delta ou discriminante) é negativo, pois senão ele dá erro em tempo de execução pois número negativo não tem raiz quadrada real, só imaginária (ou complexa)... mas daí é outra história ;).

a = int(raw_input('A: '))
b = int(raw_input('B: '))
c = int(raw_input('C: '))
d=b**2-4*a*c
if d < 0:
print 'Impossivel'
else:
x1=(-b+d**0.5)/(2*a)
x2=(-b-d**0.5)/(2*a)
print 'Discriminante', d
print "X1=", x1
print 'X2=', x2

kakita

muito obrigado alessandro afinal era mesmo facil mas assim e que se aprende
xau vou treinar mais  ;D ;D

kakita

a interface de modo de texto está completa agora vou começar a GUI optei pelo Tkinter
o que eu queria era se algum expert de python podia dar uma checada no meu script a ver se ele esta bom ou se tem muitas redundancias
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
#Criado por Miguel Soares
#Fórmula Resolvente da Equação do Segundo Grau
import sys
while 1:
a = int(raw_input('A: '))
b = int(raw_input('B: '))
c = int(raw_input('C: '))
d=b**2-4*a*c
if d < 0:
print 'Impossível'
else:
x1=(-b+d**0.5)/(2*a)
x2=(-b-d**0.5)/(2*a)
print 'Discriminante', d
print "X1=", x1
print 'X2=', x2
z = raw_input('ENTER para continuar, exit para sair: ')
if z == "exit":
print "Adeus."
raw_input('Pressione ENTER')
sys.exit()

kakita

Desisti do Tk pois achei mais graça ao glade que trabalha com GTK (assim ja vou aprendendo para quando começar a fazer screenlets) ja fiz a maior parte mas ainda tenho um problema, não sei como fazer o equivalente ao print mas graficamente, ele faz tudo graficamente menos apresentar resultado que só dá na consola.
aqui fica o código( nao sei se ajuda muito sem o ficheiro .glade):
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

# Generated with glade2py script
# glade2py script can be found at hocr web site http://hocr.berlios.de

import pygtk
pygtk.require('2.0')

import gtk, gtk.glade

class MainWindow:
    def __init__(self):
        # create widget tree ...
        xml = gtk.glade.XML('gui2.glade')

        # connect handlers
        xml.signal_autoconnect(self)

        # widgets
        self.dialog1 = xml.get_widget('dialog1')
        self.dialog_vbox1 = xml.get_widget('dialog_vbox1')
        self.menubar1 = xml.get_widget('menubar1')
        self.menuitem1 = xml.get_widget('menuitem1')
        self.menu1 = xml.get_widget('menu1')
        self.imagemenuitem5 = xml.get_widget('imagemenuitem5')
        self.scrolledwindow1 = xml.get_widget('scrolledwindow1')
        self.table1 = xml.get_widget('table1')
        self.entry3 = xml.get_widget('entry3')
        self.entry2 = xml.get_widget('entry2')
        self.entry1 = xml.get_widget('entry1')
        self.A = xml.get_widget('A')
        self.B = xml.get_widget('B')
        self.C = xml.get_widget('C')
        self.dialog_action_area1 = xml.get_widget('dialog_action_area1')
        self.calcula = xml.get_widget('calcula')
        self.Sair = xml.get_widget('Sair')

    # signal handlers
    def menubar1_activate_current_cb(self, obj, event = None):
        "menubar1_activate_current_cb activated"
        print 'menubar1_activate_current_cb activated'

    def on_imagemenuitem5_destroy(self, obj, event = None):
        "on_imagemenuitem5_destroy activated"
        print 'on_imagemenuitem5_destroy activated'

    def gtk_widget_destroy(self, obj, event = None):
        "gtk_widget_destroy activated"
        gtk.main_quit()

    def on_entry3_activate(self, obj, event = None):
        c = float(self.entry3.get_text())
        print c

    def on_entry2_activate(self, obj, event = None):
        b = float(self.entry2.get_text())
        print b

    def on_entry1_activate(self, obj, event = None):
        a =  float(self.entry1.get_text())
        print a

    def on_calcula_clicked(self, obj, event = None):
    c = float(self.entry3.get_text())
    b = float(self.entry2.get_text())
    a = float(self.entry1.get_text())
    d=b**2-4*a*c
    if d < 0:
    print 'Impossível'
    else:
x1=(-b+d**0.5)/(2*a)
x2=(-b-d**0.5)/(2*a)
print 'Discriminante', d
print "X1=", x1
print 'X2=', x2

    def button1_clicked_cb(self, obj, event = None):
        "button1_clicked_cb activated"
        gtk.main_quit()

    def on_Sair_destroy(self, obj, event = None):
        "on_Sair_destroy activated"
        print 'on_Sair_destroy activated'


# run main loop
def main():
    main_window = MainWindow()
    main_window.dialog1.show()
    gtk.main()

if __name__ == "__main__":
    main()

Darcamo

Um maneira bem simples é criar uma janela de diálogo com um botão de ok (ou sair) para fechar e um label para exibir o resultado (ou uma área de texto, etc.).

kakita

Citação de: Darcamo online 09 de Março de 2008, 23:54
Um maneira bem simples é criar uma janela de diálogo com um botão de ok (ou sair) para fechar e um label para exibir o resultado (ou uma área de texto, etc.).
sim ja tinha pensado nisso mas como faço print do resultado graficamente
por exemplo alterei a interface grafica e meti uma area de texto mas se puser print x1 só aparece o x1 na consola e nao na caixa de texto

kakita

grrrrr >:( >:( >:( TOU A DAR EM MALUCO COM ISTO
já corri toda a internet exprimentei mais 10000 comandos, já fiz funções, já fiz outra gui no glade, já fiz tudo o que me lembro e não consigo escrever mensagens graficamente elaws apenas aparecem na consola ou então dá erros
devo ser muito estúpido porque parece ser tão fácil pois não encontro ninguém com o mesmo problema (acho que gastei o google)
em sites vi que é preciso usar o pango outros dizem que não
já experimentei estes comando(entre outros):
self.textview1.set_text (penso que este seja o mais correcto)
self.textview1.mockup (acho que é neste que e preciso usar o pango)
a maior parte dos erros sao do tipo:"atribute error: 'gtk.txtview' object has no atribute 'set_text'
por favor algem me de uma ajudinha



jniltinho

#8
Citação de: kakita online 10 de Março de 2008, 20:32
grrrrr >:( >:( >:( TOU A DAR EM MALUCO COM ISTO
por favor algem me de uma ajudinha

Vou te dar uma ajuda !!

# -*- encoding: utf-8 -*-

import pygtk, gtk



# --- Mensagem de alerta --------------------------------------------------
def message (texto, janela= None) :
dialogo= gtk.MessageDialog (janela, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, texto)
dialogo.set_markup (texto)
dialogo.run ()
dialogo.destroy ()


# --- Mensagem de confirmação ---------------------------------------------
def confirmar (texto, janela= None) :
dialogo= gtk.MessageDialog (janela, gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, texto)
dialogo.set_markup (texto)
response= dialogo.run ()
dialogo.destroy ()
if response == gtk.RESPONSE_YES :
return True
else :
return False


# --- Mensagem de erro ----------------------------------------------------
def erro(texto, janela= None) :
dialogo= gtk.MessageDialog (janela, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, texto)
dialogo.set_markup (texto)
dialogo.run ()
dialogo.destroy ()


# --- Abrir Arquivo -------------------------------------------------------   
def arquivo(*args): # [name,pattern]  EX: ['images','*.png']
dialog = gtk.FileChooserDialog("Abrir ...",
None,
gtk.FILE_CHOOSER_ACTION_OPEN,
(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
gtk.STOCK_OPEN, gtk.RESPONSE_OK))
dialog.set_default_response(gtk.RESPONSE_OK)

for f in args:
filter = gtk.FileFilter()
filter.set_name(f[0])
filter.add_pattern(f[1])
dialog.add_filter(filter)


response = dialog.run()
if response == gtk.RESPONSE_OK:
return dialog.get_filename()
elif response == gtk.RESPONSE_CANCEL:
return False
dialog.destroy()


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import util

teste = util.confirmar ("<b><span color='red'>Isso é só um teste</span></b>")

if teste == True:
util.message("<b><span color='green'>Condição Verdadeira</span></b>")

else:
util.erro("<b><span color='black'>Condição Falsa</span></b>")

jniltinho

Citação de: kakita online 10 de Março de 2008, 20:32
grrrrr >:( >:( >:( TOU A DAR EM MALUCO COM ISTO
self.textview1.set_text (penso que este seja o mais correcto)
self.textview1.mockup (acho que é neste que e preciso usar o pango)
a maior parte dos erros sao do tipo:"atribute error: 'gtk.txtview' object has no atribute 'set_text'
por favor algem me de uma ajudinha

Na verdade eu acho que seria

.set_markup (texto)

kakita

vc é um deus muito obrigado isso ainda e melhor que a minha ideia de escrever na própria janela
apesar de ainda ter alguns problemas mas tenho toda a tarde para os resolver(esta tarde é so programar  ;D)
por exemplo esse seu util nao imprime floats apenas strings, e eu queria que mostra-se um string e em seguida um float tipo 'descriminante', d (penso que é so mudar o 5º argumento para outra coisa ou entao acrescentar mais um argumento)
e tambem nao imprime mais que 1 string queria fazer isto util.message ('descriminante', d, 'x1=', x1, 'x2=', x2) mas da erro
TypeError: parent must be a gtkwindow or none

mas mesmo assim já ajudou e muito
que deus e jacob estejam com vc

kakita

já estou pesquisando a um bom bocado e ainda nao consegui fazer com que o programinha imprima floats mas pelo menos quando a equaçao é impossivel ja abre uma janelinha de erro a dizer 'equaçao impossivel' em negrito e a vermelho

kakita

Citação de: kakita online 11 de Março de 2008, 13:33
já estou pesquisando a um bom bocado e ainda nao consegui fazer com que o programinha imprima floats mas pelo menos quando a equaçao é impossivel ja abre uma janelinha de erro a dizer 'equaçao impossivel' em negrito e a vermelho
já está mais perto ja consigo imprimir floats é so trnasformar o objecto em string (por exemplo: str(objecto))
ainda tenho mais um problema, nao consigo meter 2 strings. por exemplo

util.message ('Discriminante', str(d))

dá o erro: 'typeerror: parent should be a gtk.window or none'
no  ficheiro util já meti 'parent = none' mas mesmo assim nada
a resoluçao provisória que eu tenho é:

util.message ('<b>Discriminante</b>')
util.message (str(d))
util.message ('<b>X1 =</b>')
util.message (str(x1))
util.message ('<b>X2 =</b>')
util.message (str(x2))


mas fica horroroso porque aparecem 6 janelas para dar 3 informaçoes e eu queria meter tudo numa ou em 3
tem de haver uma maneira

kakita

Já está, problema resolvido
util.message ('Discriminante'+str(d))
foi só adicionar aquele +
agora o meu 1º programa está concluído
obrigado a todos aqueles que me ajudaram

Darcamo

Não se esqueça do operador % de substituição de strings (é um operador né?).
Com ele fica muito prático.
Por exemplo, digamos que queira exibir uma mensagem de erro genérica. Você pode fazer assim:
erro='Nome do Erro'
mensagem = 'O Erro %s ocorreu'
util.message (mensagem % erro)


Assim a mensagem exibida será
O Erro Nome do Erro ocorreu

É mais prático do que usar o operador + duas vezes como abaixo.
'O Erro ' + 'Nome do Erro ' + 'ocorreu'