Précédent   Forum des professionnels en informatique > Autres langages > Python & Zope > GUI > PyQt
PyQt Forum d'entraide sur PyQt
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 17/07/2009, 10h54   #1 (permalink)
Nouveau membre du Club
 
Date d'inscription: mars 2005
Localisation: Tokyo
Âge: 27
Messages: 52
Par défaut Comportement bizarre de webkit

BOnjour à tous !

Aujourd'hui j'avais décidé de m'essayer à Webkit via PyQt, et j'aimerais ajouter quelques fonctionnalités à un site en le liant a mes widgets Qt.

J'avais commencé par essayer d'introduire du code JavaScript dans le html que j'avais extrait, avant de réintroduire le tout et l'afficher, mais j'ai des problèmes d'affichage que je n'arrive pas à expliquer. Pour faire simple, les images à l'intérieur des balises href sont toutes dupliquées.

Code :
 
#
#
#
    def print_html(self):
        text = self.webView.page().mainFrame().toHtml()
        self.webView.setHtml(text, QtCore.QUrl("http://mixi.jp/"))
 
from PyQt4 import QtWebKit
 
if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Form = QtGui.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    ui.webView.setUrl(QtCore.QUrl("http://mixi.jp/"))
    sys.exit(app.exec_())
 
Si quelqu'un pouvait m'expliquer à quoi ce comportement est dû...
Bibi218 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 17/07/2009, 15h14   #2 (permalink)
Membre émérite
 
Date d'inscription: décembre 2006
Messages: 952
Par défaut

Salut,
peux-tu mettre un ECM (ie un Exemple Complet Minimal) ?
rambc est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 17/07/2009, 17h36   #3 (permalink)
Nouveau membre du Club
 
Date d'inscription: mars 2005
Localisation: Tokyo
Âge: 27
Messages: 52
Par défaut

No problemo

Code :
 
# -*- coding: utf-8 -*-
 
# Form implementation generated from reading ui file 'untitled.ui'
#
# Created: Sat Jul 18 00:32:48 2009
#      by: PyQt4 UI code generator 4.4.4
#
# WARNING! All changes made in this file will be lost!
 
from PyQt4 import QtCore, QtGui, QtWebKit
 
class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(808, 639)
        self.gridLayout = QtGui.QGridLayout(Form)
        self.gridLayout.setObjectName("gridLayout")
        self.webView = QtWebKit.QWebView(Form)
        self.webView.setUrl(QtCore.QUrl("about:blank"))
        self.webView.setObjectName("webView")
        self.gridLayout.addWidget(self.webView, 0, 0, 1, 2)
        spacerItem = QtGui.QSpacerItem(395, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem, 1, 0, 1, 1)
        self.buttonBox = QtGui.QDialogButtonBox(Form)
        self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
        self.buttonBox.setObjectName("buttonBox")
        self.gridLayout.addWidget(self.buttonBox, 1, 1, 1, 1)
 
        self.retranslateUi(Form)
        QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("rejected()"), Form.close)
        QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("accepted()"), self.print_html)
        QtCore.QMetaObject.connectSlotsByName(Form)
 
    def retranslateUi(self, Form):
        Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
 
    def print_html(self):
        text = self.webView.page().mainFrame().toHtml()
        self.webView.setHtml(text, QtCore.QUrl("http://mixi.jp/"))
 
if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Form = QtGui.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    ui.webView.setUrl(QtCore.QUrl("http://mixi.jp/"))
    sys.exit(app.exec_())
 
Il suffit de cliquer sur OK pour voir le comportement bizarre à l'oeuvre.
Bibi218 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 18/07/2009, 20h02   #4 (permalink)
Membre émérite
 
Date d'inscription: décembre 2006
Messages: 952
Par défaut

En regardant le source de la page HTML, je suis tombé sur :
Code :
<noscript>
<iframe src="http://n3.ads.mixi.jp/hserver/SITE=login/AREA=NEWTARGETING.BANNER/AAMSZ=468X60/GENDER=S2/AGE=1/PREF=13/OCC=1/PARA=101/LC=0/JCC=0/MID=0/NDCC=0/ECHO=0/ACC_RANDOM=83871470" noresize="noresize" scrolling="no" hspace="0" vspace="0" frameborder="0" marginheight="0" marginwidth="0" width="468" height="60" allowTransparency="true"></iframe>
</noscript>
Cela peut être une piste mais très franchement je lance cela comme ça. Il faudrait en fait faire une page HTML la plus simple possible qui reproduise le souci car ta page HTML est monstrueuse.
Si j'avais à tester je regarderais d'abord du côté de ce <noscript>.
rambc est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 21/07/2009, 10h30   #5 (permalink)
Nouveau membre du Club
 
Date d'inscription: mars 2005
Localisation: Tokyo
Âge: 27
Messages: 52
Par défaut

Problème résolu pour les images dupliquées, cela semble venir de la balise <iframe>.

Maintenant, j'essaie d'appeler mes méthodes Python depuis Javascript, mais pour une raison que j'ignore elles ne sont pas exécutées.

J'utilise le HTML suivant, venant de la démo Qt

Code :
 
<html><script>
function extractFormValues()
{
    var firstName = document.getElementById("firstname").value;
    var lastName = document.getElementById("lastname").value;
        
    formExtractor.setValues(firstName, lastName);
}
</script><body>
<h1>
The Green People Book Club
</h1>
 
<p>
Welcome to The Green People Book Club. Please register to obtain a membership with us.
</p>
    <form onsubmit="extractFormValues()">
    <table>
    <tbody><tr>
        <td>
        First name:
        </td>
        <td>
            <input type="text" id="firstname">
        </td>
    </tr>
    <tr>
        <td>
        Last name:
        </td>
        <td>
            <input type="text" id="lastname">
        </td>
    </tr>
    <tr>
        <td>
        Gender:
        </td>
        <td>
        <input type="radio" name="gender" id="genderMale" value="Male"> Male
        <input type="radio" name="gender" id="genderFemale" value="Female"> Female
        </td>
    </tr>
    <tr>
        <td colspan="2">
        <input type="checkbox" id="updates" value="receive">
        Check here if you would like to receive regular updates from us:
        </td>
    </tr>
    </tbody></table>
    <input type="submit" value="Submit">
    </form>
 
</body></html>
 
et le code Python ci-dessous.

Code :
 
class Ui_Form(QtCore.QObject):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(800, 600)
        self.gridLayout = QtGui.QGridLayout(Form)
        self.gridLayout.setObjectName("gridLayout")
        self.webView = QtWebKit.QWebView(Form)
        self.webView.setUrl(QtCore.QUrl("about:blank"))
        self.webView.setObjectName("webView")
        self.gridLayout.addWidget(self.webView, 0, 0, 1, 2)
        self.textBrowser = QtGui.QTextBrowser(Form)
        self.textBrowser.setMaximumSize(QtCore.QSize(16777215, 128))
        self.textBrowser.setObjectName("textBrowser")
        self.gridLayout.addWidget(self.textBrowser, 1, 0, 1, 2)
        self.label = QtGui.QLabel(Form)
        self.gridLayout.addWidget(self.label, 2, 0, 1, 2)
 
        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)
 
    def retranslateUi(self, Form):
        Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setText("Test Javascript")
        
    def setValues(self, firstName, lastName):
        self.label.setText(" ".join([firstName, lastName]))
 
    def populate(self):
        self.webView.page().mainFrame().addToJavaScriptWindowObject("formExtractor", self);
 
 
from PyQt4 import QtWebKit
 
if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Form = QtGui.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    # C'est bien connecte ici, j'ai verifie
    QtCore.QObject.connect(ui.webView.page().mainFrame(),
                           QtCore.SIGNAL("javaScriptWindowObjectCleared()"),
                           ui.populate)
    ui.webView.page().mainFrame().setHtml(html)
  
    # ca marche
    ui.webView.page().mainFrame().evaluateJavaScript('document.getElementById("firstname").value = "BEBERT"')
    # ca ne marche pas    
    ui.webView.page().mainFrame().evaluateJavaScript('formExtractor.setValues("oyo","mouah")')
    sys.exit(app.exec_())
 
Dans la doc Qt, il est dit que les Slots sont visibles depuis Javascript, donc j'ai supposé que le problème pouvait éventuellement venir de là, mais mes quelques tests n'ont pas été très concluants.

Est-ce que quelqu'un s'est déjà essayé à la chose en Python ?
Bibi218 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 21/07/2009, 14h42   #6 (permalink)
Membre émérite
 
Date d'inscription: décembre 2006
Messages: 952
Par défaut

Citation:
Envoyé par Bibi218 Voir le message
Problème résolu pour les images dupliquées, cela semble venir de la balise <iframe>.
Tu as résolu le souci comment.

Citation:
Envoyé par Bibi218 Voir le message
Maintenant, j'essaie d'appeler mes méthodes Python depuis Javascript, mais pour une raison que j'ignore elles ne sont pas exécutées.
Dans la doc Qt, il est dit que les Slots sont visibles depuis Javascript, donc j'ai supposé que le problème pouvait éventuellement venir de là, mais mes quelques tests n'ont pas été très concluants.
Est-ce que quelqu'un s'est déjà essayé à la chose en Python ?
J'avais essayé sans grand succès. Si tu arrives à quelque chose qui passe de Python à JavaScript, je suis preneur, mais aussi si tu arrives à passer de JavaScipt à Python car cela me semble tout aussi utile, voire plus utile.
rambc est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 21/07/2009, 15h40   #7 (permalink)
Nouveau membre du Club
 
Date d'inscription: mars 2005
Localisation: Tokyo
Âge: 27
Messages: 52
Par défaut

J'ai viré la balise et ça marchait ^^

Sinon je viens de trouver ça sur une mailing list

Citation:
QWebFrame's addToJavaScriptWindowObject() method lets you insert an instance
of a QObject subclass into the page. You can expose methods to JavaScript,
but you have to declare them as slots with the @pyqtSignature() decorator.
J'essaierai demain pour voir ce qu'il en est !!!
Bibi218 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 22/07/2009, 02h35   #8 (permalink)
Nouveau membre du Club
 
Date d'inscription: mars 2005
Localisation: Tokyo
Âge: 27
Messages: 52
Par défaut

Je confirme, rajouter le décorateur
@QtCore.pyqtSlot(str, str)
au dessus de ma fonction setValues fait marcher le tout !!!

Je peux maintenant échanger des informations entre Python et Javascript !!!
Happy

Merci pour ton aide rambc !
Bibi218 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 22/07/2009, 14h05   #9 (permalink)
Membre émérite
 
Date d'inscription: décembre 2006
Messages: 952
Par défaut

Bravo.

Peux-tu mettre ici un exemple concret pas trop compliqué, ni trop simple de communication Python --> JavaScript et aussi JavaScript --> Python ? Cela pourrait me faire gagner pas mal de temps mais aussi à d'autres.

Dernière modification par rambc ; 22/07/2009 à 20h16.
rambc est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 23/07/2009, 02h51   #10 (permalink)
Nouveau membre du Club
 
Date d'inscription: mars 2005
Localisation: Tokyo
Âge: 27
Messages: 52
Par défaut

En fait mon exemple du dessus marche tel quel (en rajoutant le decorateur ou il faut).

Pour la communication JS > Python :
J'appelle depuis JS mon objet, que j'ai lie a la page via addToJavaScriptWindowObject.
Les methodes de mon objet sont accessibles en JS, a condition d'utiliser le decorateur.

Pour la communication Python > JS :
J'utilise juste la fonction evaluateJavaScript, qui prend en argument une chaine de caracteres.

On va pouvoir faire plein de trucs sympa avec ca !!!
Bibi218 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 23/07/2009, 17h57   #11 (permalink)
Membre émérite
 
Date d'inscription: décembre 2006
Messages: 952
Par défaut

Citation:
Envoyé par Bibi218 Voir le message
En fait mon exemple du dessus marche tel quel (en rajoutant le decorateur ou il faut).:
En fait j'ai dû faire ceci :
Code :
    @QtCore.pyqtSlot(str, str)
    def setValues(self, firstName, lastName):
        self.label.setText(" ".join([str(firstName), str(lastName)]))
Citation:
Envoyé par Bibi218 Voir le message
On va pouvoir faire plein de trucs sympa avec ca !!!
C'est pas mal du tout.

Je vais essayer de tester cela (quand j'aurais du temps) avec GeoGebra. L'idée est d'utiliser ce très bon logiciel de géométrie dynamique au sein d'une application PyQt. En espérant que cela fonctionne...
rambc est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 24/07/2009, 05h02   #12 (permalink)
Nouveau membre du Club
 
Date d'inscription: mars 2005
Localisation: Tokyo
Âge: 27
Messages: 52
Par défaut

GeoGebra c'est pas une applet Java a la base ?

Le probleme avec ce systeme, c'est qu'il faut rajouter soit meme les bouts de JavaScript dans la page web, et donc editer le html correspondant dans le programme... pas vraiment pratique quand on ne maitrise pas ce qui se passe cote serveur
Bibi218 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 24/07/2009, 10h33   #13 (permalink)
Membre émérite
 
Date d'inscription: décembre 2006
Messages: 952
Par défaut

Citation:
Envoyé par Bibi218 Voir le message
GeoGebra c'est pas une applet Java a la base ?

Le probleme avec ce systeme, c'est qu'il faut rajouter soit meme les bouts de JavaScript dans la page web, et donc editer le html correspondant dans le programme... pas vraiment pratique quand on ne maitrise pas ce qui se passe cote serveur
En fait mon idée est plus simple.
  1. Je fais une appli PyQt avec dans un des dossiers une feuille HTML avec l'applet Java.
  2. J'ajoute le code JavaScript dans la page HTML pour communiquer avec cet applet.
  3. J'ajoute ensuite d'autres fonctions JavaScript pour la communication avec PyQt.
Tout se fait au final localement. J'ai ainsi un grapheur performant sans avoir à le fabriquer moi même ce qui me demanderait beaucoup de temps.
rambc est déconnecté   Envoyer un message privé Réponse avec citation
NEWS PYTHONF.A.Q PYTHONTUTORIELS PYTHONSOURCES PYTHONOUTILS PYTHONLIVRES PYTHON

Réponse Proposer ce sujet en actualité

Précédent   Forum des professionnels en informatique > Autres langages > Python & Zope > GUI > PyQt



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non



Fuseau horaire GMT +1. Il est actuellement 16h44.


Vos questions techniques : forum d'entraide Python - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2010 www.developpez.com - Legal informations.