• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

kakita

Problema com GUI

18 mensagens neste tópico

Boas

inscrevi-me á pouco no fórum e também sou novato em python por isso não me brutalizem  :cheesygrin:

vou fazer uma breve introduçao sobre este programinha. Este projecto foi o primeiro e unico que desenvolvi, quis criar um progrma completo, primeiro em texto depois com interface grafica (para ficar a saber de tudo um pouco)

li  80 paginas de um livro de 120 paginas sobre python e aprendi alguma coisa com os exemplo que se encontrvam no livro e fiz isto(sei que provavelmente tem algumas redundâncias):

#!/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()

depois comecei por estudar um pouco de tk mas depressa me fartei e optei pelo glade(resultados mais rapidos :-[ ) e fiz isto:

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

# 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()

o problema que tenho é que nao consigo fazer com o x1, o x2, o discriminante e a mensagem de erro "impossivel"

apareçam  na janela que criei, tenho o comando print que só apresenta aquilo que quero na consola. logo o que eu queria era saber o comando equivalente ao print mas a nivel grafico

já experimentei estes comandos(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 alguem me pode dar uma ajudinha     

Peço desculpa pois fiz uma coisa que nao devia, como o post tava muito grande cortei do meu programa os comentários iniciais das licenças

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Preciso do ficheiro xml criado pelo glade sff e já agora, diz-me onde no código é que está o self.textview1. É que não encontro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

bem o self.textview1 não esta ai porque eu criei mais um glade para fazer experiências e isso é o não é meu codigo de teste mas sim o backup

de qualquer das maneiras o problema está quase resolvido mas ainda não completamente

no forum do ubuntu um amigo deu uma ajuda. Ele passou um .py com algumas mensagens ja configuradas depois so tenho de im portar e mudar o texto o problema e que nao consigo fazer com elas mostrem floats, penso que tenha a ver com os argumentos mas mesmo depois de juntar o argumento float ele não dá

este é o codigo do progrma que faz janelas de mensagens(é muito util recomendo a todos)

# -*- 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()

para usar é só importar util e escrever por exemplo

util.message('joaquim')

agora meu codigo em python ficou assim ( aqui so tenho a parte que alterei)

    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'
    		util.erro ("<b><span color='red'>Equação Impossível</span></b>")
    	else:
		x1=(-b+d**0.5)/(2*a)
		x2=(-b-d**0.5)/(2*a)
		print 'Discriminante', d
		print "X1=", x1
		print 'X2=', x2
		util.message ('<b>X1=</b>')
		util.message ('<b>X2=</b>')
		util.message ('<b>Discriminante</b>')

eu queria que mostra-se um string e em seguida um float tipo util.message('descriminante', d) mas dá erro diz que nao posso usar floats apenas string or none

vou ver se faço upload do .glade mas acho desnessessario

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para converteres um objecto qualquer para uma string (de forma a poderes concatenar), é só fazeres str(objecto)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para converteres um objecto qualquer para uma string (de forma a poderes concatenar), é só fazeres str(objecto)

lol que coisa mais simples. Muito obrigado ajudou muito, nunca tinha pensado nisso, acho que tenho de voltar a ler o livro de python outra vez agora que ja tenho outra visão sobre isto

obrigado e fiquem bem

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

brrrrr :rant_01:

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  :wallbash:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E que tal juntares as 2 strings que queres numa só? Não estou a par da thread, mas pode ser que seja o que queres. Separas com um newline.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E que tal juntares as 2 strings que queres numa só? Não estou a par da thread, mas pode ser que seja o que queres. Separas com um newline.

Pois talvez isso resulte mas primeiro tinha de perceber aquilo que disseste ;) sou novato ainda

mas vou dar uma googladela e talvez descubra o como se faz isso

newline é o que?? isto (|) ??


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

Razão do Edit: Juntei os 2 posts

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Era isso que eu queria dizer :) Um new line é .. uma nova linha ;)

string1 = 'bla'
string2 = 'ble'
string_final = string1+'\n'+string2

O \n é como o efeito de um enter no word :P

>>> print string_final
bla
ble
>>> 

O que tu fizeste ai em cima com esse '+', chama-se concatenar strings. Para isso ficar mais legível, podes sempre adicionar a tal new line a seguir ao Discriminante, ficando tipo isto:

util.message('Discriminante\n'+str(d))

:D Boa sorte para futuros projectos!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

nesta do newline fiquei eu mal  :-[

como tava tudo junta pensei que fosse um termo expecial dos peritos de python

obrigado tambem tinha pensado em como fazer o tal efeito efeito de enter mas depois como não era preciso desesti da ideia mas agora já serve para quando precisar

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

djthyrax isso dos slice já conhecia

eu li o "Introdução a Python – Módulo A. “Bem-vindo a Python!”" que se encontra aqui neste site http://grupopython.cjb.net/ e aí fala de tudo um pouco e tem muitos exemplos o pior é que os mais dificeis não dao no linux porque importam tipo os sons do windows e cenas assim

mas achei esse livro muito bom, agora tenho de ler o modulo b, vou aproveitar estas 2 semanas de ferias para dar umas mexidelas em python e no kernel do ubuntu

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Esses livros até são porreiros, também comecei por ler por lá B) Mas olha que pouco ou nada me ficou na cabeça. Depois mais tarde li na net o tut da página oficial de Python e fiz uns exercicios e olha que colou bem melhor :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu aprendi muito mais Python a ler código, resolver problemas com programação e no Wataplayah do que na biblioteca autêntica de Python que tenho.

E posso afirmar que a programar aprendes mais do que num milhão de livros... eles ajudam, mas é para entenderes o básico. A partir daí, toca a ler código, que é o que não falta no Armazém de Código.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ya tambem sempre fui defensor que só se aprende com a pratica mas um pelo menos o basico é presico saber senão é chinês, e esse livro eu lia-o no computador e ia exprimentando o código que eles diziam lá

joao rodrigues onde arranjaste esses exercicios se foi na net podes-me mandar o link ???

fikem bem

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigadíssimo vou ver se começo amanha a fazer isso porque tive agora 2 noites muito grandes e neste estado não consigo fazer nada

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora