Um programa que faça as duas coisas ao mesmo tempo, eu desconheço. No entanto, você pode fazer as duas coisas separadas.
Para a interface gráfica, você pode utilizar um aplicativo chamado Glade (
https://apps.ubuntu.com/cat/applications/glade/). Esse aplicativo permite desenhar interfaces gráficas GTK arrastando componentes, e em seguida exportar um arquivo de extensão .glade, cuja sintaxe é similar a XML.
Para fazer a programação da interface gráfica e do aplicativo como um todo, tendo conhecimentos básicos de Python, você pode fazer a codificação no braço utilizando NetBeans ou Eclipse.
Os dois exemplos abaixo fazem isso:
Código em Python:
#!/usr/bin/env python
import sys
try:
import pygtk
pygtk.require("2.0")
except:
pass
try:
import gtk
except:
print("GTK Not Available")
sys.exit(1)
class proxer_GUI:
def __init__(self):
builder = gtk.Builder()
builder.add_from_file("proxer.glade")
self.janela_proxer = builder.get_object ("janela_proxer")
self.entrada_nomeusuario = builder.get_object("entrada_nomeusuario")
self.entrada_senha = builder.get_object("entrada_senha")
self.botao_ok = builder.get_object("botao_ok")
self.botao_cancelar = builder.get_object("botao_cancelar")
def passar_credenciais(self, object):
print self.entrada_nomeusuario.get_text()
print self.entrada_senha.get_text()
gtk.main_quit()
proxer_GUI = proxer_GUI()
proxer_GUI.janela_proxer.connect("destroy", gtk.main_quit)
proxer_GUI.botao_ok.connect("clicked", proxer_GUI.passar_credenciais)
proxer_GUI.botao_cancelar.connect("clicked", gtk.main_quit)
proxer_GUI.janela_proxer.show()
gtk.main()
Arquivo proxer.glade, referenciado no código acima:
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.24"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="janela_proxer">
<property name="can_focus">False</property>
<property name="window_position">center</property>
<child>
<object class="GtkFrame" id="frame1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="bottom_padding">12</property>
<property name="left_padding">12</property>
<property name="right_padding">12</property>
<child>
<object class="GtkTable" id="table1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="n_rows">4</property>
<property name="n_columns">2</property>
<property name="column_spacing">10</property>
<property name="row_spacing">5</property>
<child>
<object class="GtkImage" id="imagem_chave">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="pixbuf">proxer.svg</property>
</object>
</child>
<child>
<object class="GtkLabel" id="rotulo_mensagem">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">O proxy http://proxy.betania.uvanet.br:3128 está solicitando
um nome de usuário e senha para executar o comando "hplip-setup"</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="rotulo_nomeusuario">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">1</property>
<property name="label" translatable="yes">Nome de usuário:</property>
</object>
<packing>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="entrada_nomeusuario">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">•</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">1</property>
<property name="bottom_attach">2</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="rotulo_senha">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">1</property>
<property name="label" translatable="yes">Senha:</property>
</object>
<packing>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="entrada_senha">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="visibility">False</property>
<property name="invisible_char">•</property>
<property name="primary_icon_activatable">False</property>
<property name="secondary_icon_activatable">False</property>
<property name="primary_icon_sensitive">True</property>
<property name="secondary_icon_sensitive">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
</packing>
</child>
<child>
<object class="GtkHButtonBox" id="hbuttonbox1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">10</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="botao_cancelar">
<property name="label">gtk-cancel</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="botao_ok">
<property name="label">gtk-ok</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_action_appearance">False</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">3</property>
<property name="bottom_attach">4</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="label1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_markup">True</property>
</object>
</child>
</object>
</child>
</object>
</interface>
Outro aplicativo que é tido como um IDE completo para desenvolvimento em Python, tanto no que diz respeito a interface gráfica como em código, chama-se Quickly (
https://apps.ubuntu.com/cat/applications/quickly/). Em teoria, por ele você pode desenhar a interface gráfica e escrever o código num programa só, sem falar que esse programa facilita no processo de localização do aplicativo (tradução para outras línguas), armazenamento de arquivos de configuração, empacotamento, etc.
Nesse link do Askubuntu você encontra mais detalhes:
http://askubuntu.com/questions/56225/is-there-an-gui-designer-for-python