Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#1 Tue 04 August 2015 19:50

geogeo
Juste Inscrit !
Date d'inscription: 4 Aug 2015
Messages: 4

QGIS 2.8 & plugin python : appeler une méthode sur un click bouton

Bonjour,

Je débute dans le développement d'une extension Qgis et je ne parviens pas à exécuter une méthode à partir d'un bouton créé dans qdesigner.

J'ai créé la fonction select_name dans mon fichier nomplugin.py, ainsi qu'un bouton QpushButton dans ma boite de dialogue dlg.

Code:

    def select_name(self):
        filename = "abc"
        print (filename)
        
    def run(self):
        """Run method that performs all the real work"""        
         # show the dialog
        self.dlg.show()
        # Run the dialog event loop
        result = self.dlg.exec_()
        # See if OK was pressed
        if result:

J'ai lu pas mal de doc sur internet mais je ne parviens pas à connecter mon bouton (nom:pushButton) à ma méthode. J'ai essayé de placer les 2 codes suivants à la fin de la méthode __init__ mais ça n'a pas fonctionné.

Code:

self.dlg.pushButton.clicked.connect(self.select_name)

ou

Code:

self.connect(self.ui.pushButton,SIGNAL("clicked()"),self.select_name)

Qgis ne parvient pas a charger le plugin. Cependant, il y fonctionne quand il y a pas cette ligne.

Par avance merci,
Cordialement.

Dernière modification par geogeo (Tue 04 August 2015 20:33)

Hors ligne

 

#2 Wed 05 August 2015 10:15

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 3814

Re: QGIS 2.8 & plugin python : appeler une méthode sur un click bouton

Bonjour

Code:

self.connect(self.ui.pushButton,SIGNAL("clicked()"),self.select_name)

Qgis ne parvient pas a charger le plugin. Cependant, il y fonctionne quand il y a pas cette ligne.


C'est parce que vous faites appel à self.ui (que votre plugin ne connait pas) au lieu de self.dlg. A l'usage, préférez la première forme d'écriture pour la connexion du bouton à cette seconde. La première écriture est plus pythonesque, plus facile à écrire car moins sujette à l'erreur de frappe et est destinée à remplacer celle-ci.

Pour ce qui est du clic:
- il me semble que print avec parenthèses est une écriture python 3 et QGIS est pour l'instant en Python 2 donc ce serait plutôt print filename
- mais la méthode print renvoie l'info sur une sortie (généralement la fenêtre d'exécution du code - je ne m'attarderai pas dessus au risque de dire des bêtises - voir les notions de stdin/stdout). Et là vous n'avez pas l'interface d'écriture, même si on peut forcer l'affichage à l'écran. Perso, dans QGIS, j'utilise soit une QMessageBox ou une messageBar.
Essayez donc avec ce code

Code:

    def select_name(self):
        filename = "abc"
        self.iface.messageBar()pushMessage ('MonPlugin:', filename, level=QgsMessageBar.INFO)

Dernière modification par SANTANNA (Wed 05 August 2015 10:19)

Hors ligne

 

#3 Wed 05 August 2015 13:58

geogeo
Juste Inscrit !
Date d'inscription: 4 Aug 2015
Messages: 4

Re: QGIS 2.8 & plugin python : appeler une méthode sur un click bouton

Merci Santana pour ta réponse,

Tu me confirmes donc que cette ligne devrait fonctionner placé à la fin de la méthode __init__?

Code:

self.dlg.pushButton.clicked.connect(self.select_name)

J'ai toujours le même message d'erreur lorsque je l'ajoute :

Code:

Impossible de charger l'extension deuxieme provoque une erreur lors de l'appel de sa méthode classFactory()


Traceback (most recent call last):
  File "C:/PROGRA~1/QGISWI~1/apps/qgis/./python\qgis\utils.py", line 219, in startPlugin
    plugins[packageName] = package.classFactory(iface)
  File "C:/Users/renard/.qgis2/python/plugins\deuxieme\__init__.py", line 34, in classFactory
    from .deuxie import deuxieme
  File "C:/PROGRA~1/QGISWI~1/apps/qgis/./python\qgis\utils.py", line 478, in _import
    mod = _builtin_import(name, globals, locals, fromlist, level)
  File "C:/Users/renard/.qgis2/python/plugins\deuxieme\deuxie.py", line 71
    self.dlg.pushButton.clicked.connect(self.select_name)
   ^
IndentationError: unexpected indent


Version de Python :
2.7.5 (default, May 15 2013, 22:44:16) [MSC v.1500 64 bit (AMD64)]


Version de QGIS :
2.8.1-Wien Wien, exported

Chemin vers Python : ['C:/Users/renard/.qgis2/python/plugins\\processing', 'C:/PROGRA~1/QGISWI~1/apps/qgis/./python', u'C:/Users/renard/.qgis2/python', u'C:/Users/renard/.qgis2/python/plugins', 'C:/PROGRA~1/QGISWI~1/apps/qgis/./python/plugins', 'C:\\PROGRA~1\\QGISWI~1\\apps\\Python27\\lib\\site-packages\\matplotlib-1.3.1-py2.7-win-amd64.egg', 'C:\\PROGRA~1\\QGISWI~1\\apps\\Python27\\lib\\site-packages\\nose-1.3.3-py2.7.egg', 'C:\\PROGRA~1\\QGISWI~1\\apps\\Python27\\lib\\site-packages\\tornado-4.0.1-py2.7-win-amd64.egg', 'C:\\PROGRA~1\\QGISWI~1\\apps\\Python27\\lib\\site-packages\\backports.ssl_match_hostname-3.4.0.2-py2.7.egg', 'C:\\PROGRA~1\\QGISWI~1\\apps\\Python27\\lib\\site-packages\\certifi-14.05.14-py2.7.egg', 'C:\\PROGRA~1\\QGISWI~1\\bin\\python27.zip', 'C:\\PROGRA~1\\QGISWI~1\\apps\\Python27\\DLLs', 'C:\\PROGRA~1\\QGISWI~1\\apps\\Python27\\lib', 'C:\\PROGRA~1\\QGISWI~1\\apps\\Python27\\lib\\plat-win', 'C:\\PROGRA~1\\QGISWI~1\\apps\\Python27\\lib\\lib-tk', 'C:\\PROGRA~1\\QGISWI~1\\bin', 'C:\\PROGRA~1\\QGISWI~1\\apps\\Python27', 'C:\\PROGRA~1\\QGISWI~1\\apps\\Python27\\lib\\site-packages', 'C:\\PROGRA~1\\QGISWI~1\\apps\\Python27\\lib\\site-packages\\PIL', 'C:\\PROGRA~1\\QGISWI~1\\apps\\Python27\\lib\\site-packages\\jinja2-2.7.2-py2.7.egg', 'C:\\PROGRA~1\\QGISWI~1\\apps\\Python27\\lib\\site-packages\\markupsafe-0.23-py2.7-win-amd64.egg', 'C:\\PROGRA~1\\QGISWI~1\\apps\\Python27\\lib\\site-packages\\pytz-2012j-py2.7.egg', 'C:\\PROGRA~1\\QGISWI~1\\apps\\Python27\\lib\\site-packages\\win32', 'C:\\PROGRA~1\\QGISWI~1\\apps\\Python27\\lib\\site-packages\\win32\\lib', 'C:\\PROGRA~1\\QGISWI~1\\apps\\Python27\\lib\\site-packages\\Pythonwin', 'C:\\PROGRA~1\\QGISWI~1\\apps\\Python27\\lib\\site-packages\\Shapely-1.2.18-py2.7-win-amd64.egg', 'C:\\PROGRA~1\\QGISWI~1\\apps\\Python27\\lib\\site-packages\\six-1.3.0-py2.7.egg', 'C:\\PROGRA~1\\QGISWI~1\\apps\\Python27\\lib\\site-packages\\wx-2.8-msw-unicode', 'C:\\PROGRA~1\\QGISWI~1\\apps\\Python27\\lib\\site-packages\\xlrd-0.9.2-py2.7.egg', 'C:\\PROGRA~1\\QGISWI~1\\apps\\Python27\\lib\\site-packages\\xlwt-0.7.5-py2.7.egg', u'C:/Users/renard/.qgis2//python', 'C:\\PROGRA~1\\QGISWI~1\\apps\\qgis\\python\\plugins\\fTools\\tools']

Le problème viendrait d'ailleurs? Pour créer mon pushbutton, j'utilise qdesigner de qt4 + python 2.7 + qgis 2.8.1.

Code:

a méthode print renvoie l'info sur une sortie (généralement la fenêtre d'exécution du code - je ne m'attarderai pas dessus au risque de dire des bêtises - voir les notions de stdin/stdout). Et là vous n'avez pas l'interface d'écriture, même si on peut forcer l'affichage à l'écran. Perso, dans QGIS, j'utilise soit une QMessageBox ou une messageBar.
Essayez donc avec ce code

Merci du conseil, il me sera très pratique pour la suite.

Cette extrait de run renvoi abc dans la console python de qgis aprés le click sur ok.
   

Code:

    def run(self):
        """Run method that performs all the real work"""        
         # show the dialog
        self.dlg.show()
        # Run the dialog event loop
        result = self.dlg.exec_()
        # See if OK was pressed
        if result:
           print "abc"

Merci

Hors ligne

 

#4 Wed 05 August 2015 14:34

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 3814

Re: QGIS 2.8 & plugin python : appeler une méthode sur un click bouton

L'erreur que tu as est une erreur d'indentation. Vérifie donc qu'il y a bien cohérence entre le nombre d'espaces en début de ligne avec la ligne du dessus.

Hors ligne

 

#5 Wed 05 August 2015 15:23

geogeo
Juste Inscrit !
Date d'inscription: 4 Aug 2015
Messages: 4

Re: QGIS 2.8 & plugin python : appeler une méthode sur un click bouton

Merci pour ton aide, j'ai pu corriger mon problème.

Une fois l'indentation corrigée (je débute aussi sur python, j'alignais le tout avec des tabulations), j'ai pu corriger mon code et tout fonctionne. Aussi j'avais mal placé la méthode ci-dessous.  Je l'ai finalement mise avant self.dlg.pushButton.clicked.connect(self.lenom)

Code:

 def select_name(self):
        filename = "abc"
        print (filename)

Dernière modification par geogeo (Wed 05 August 2015 15:28)

Hors ligne

 

#6 Wed 05 August 2015 15:42

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 3814

Re: QGIS 2.8 & plugin python : appeler une méthode sur un click bouton

je débute aussi sur python, j'alignais le tout avec des tabulations


Ca n'est pas problématique en soi. Le tout est d'être consistant et cohérent, de ne pas mixer les deux types d'indentation : si tu pars sur des tabulations, faut les conserver jusqu'au bout.

Hors ligne

 

#7 Wed 05 August 2015 16:57

geogeo
Juste Inscrit !
Date d'inscription: 4 Aug 2015
Messages: 4

Re: QGIS 2.8 & plugin python : appeler une méthode sur un click bouton

ok, merci pour ces précieux conseils. Je comprends parfaitement mon erreur maintenant.

J'alignais ma ligne avec le code fourni par plugin builder, qui lui avait un alignement avec espaces.

Hors ligne

 

Pied de page des forums

Powered by FluxBB