Recentemente eu me vi obrigado a mudar a linha de desenvolvimento de um projeto meu, e pra isso eu resolvi abandonar muita coisa e me dedicar de fato ao Python. Eu sempre soube que a comunidade do Python era muito grande e bem entusiasmada, mas me surpreendi com o quanto eu consegui progredir em tão pouco tempo, tá dando tempo até de postar no blog e adiantar tempo no cronograma
Enfim, minha situação é a seguinte: pretendo fazer um sistema web, com a interface inteira em HTML e um back-end qualquer (tá, eu vou escolher o Django, mas você que está lendo é livre para escolher qualquer outro), mas que o usuário final veja esse sistema como um software comum, com atalho na área de trabalho, janelinha dedicada e tudo mais. Até ai eu poderia usar um Adobe AIR da vida, mas o problema é que eu preciso me comunicar com alguns recursos do PC, tipo comandos no terminal, janela de autenticação, ou até mesmo um “visual” mais desktop. Então me surgiram diversas opções pra Mono, Python, e até o C++… Mas quem me agradou de verdade foi o PySide, uma binding oficial do Qt em Python.
O que me convenceu a gostar do PySide foi a facilidade de implementar instâncias derivadas de QObject dentro de um QWebView, essas instâncias ficam acessíveis no objeto window do JavaScript. Suponhamos que eu tenha uma classe mais ou menos assim:
from PySide import QtCore
class MyJSObject(QtCore.QObject):
@QtCore.Slot()
def teste(self):
print "Hello from JavaScript"
Com essa classe criada, eu posso adicioná-la ao frame principal de um determinado QWebView da seguinte maneira:
meuBrowser = QtWebKit.QWebView()
meuBrowser.load(QtCore.QUrl('http://localhost/minhapagina.htm'))
meuBrowser.page().mainFrame().addToJavaScriptWindowObject('myjs', MyJSObject())
Experimente fazer uma chamada no JavaScript ao objeto window["myjs"].teste(), ou se você preferir injetar um código JavaScript para esse fim, também é possível através do evaluateJavaScript():
meuBrowser.page().mainFrame().evaluateJavaScript('window["myjs"].teste()')
Agora é só conferir o terminal do Python pra você ver o print do método teste() funcionando. A partir desse conceito você tem uma gama de opções para desenvolver aplicações ricas usando todo potencial do Python e do que há de melhor na web ao mesmo tempo.
Não se esqueça de os métodos declarados dentro da sua classe derivada de QObject precisam do decorator Slot para ficarem visíveis no JavaScript. Para tirar mais dúvidas quanto as slots e aos signals, leia esse trecho da documentação oficial.
Dedico esse artigo ao pessoal do canal #python na rede vIRCio, em especial ao Rafaelzinhu por ter me indicado esse servidor IRC e ao vitorlobo com o blog Pythonando, que serviu de ótima referência pra que eu pudesse destrinchar bastante coisa sobre o PySide.
Terry Laundos Aguiar
28 28UTC setembro 28UTC 2011 at 6:36 PM
Parabéns pelo artigo Timóteo, estou com uma missão, que me vi na duvida de como e com o que realizar, já me passou pela cabeça Python, Java e até C . No momento estou achando que vou embarcar nessa sua idéia. Parabéns mesmo
timoteoramos
28 28UTC setembro 28UTC 2011 at 8:52 PM
Obrigado pelo comentário, Terry
Em um único dia eu estou conseguindo fazer tudo que eu quero com o PySide, inclusive essa comunicação com JavaScript, é o canal perfeito pra fazer bastante coisa com Django, jQuery e outras ótimas tecnologias da web… Eu ainda vou escrever um artigo sobre PyInstaller e Py2Exe pra fazer executáveis Windows em breve, além de trocar umas ideias com o vitorlobo pra incrementar o material dele de PySide.