Plugin QGIS: problèmes lors de l'importation du fichier de ressources (resources_rc) - le plugin ne se charge pas - problèmes PATH?

12

Je construis le plugin qgis et je ne trouve pas de solution à cette erreur.

File "/usr/lib/python2.7/dist-packages/qgis/utils.py", line 478, in _import
    mod = _builtin_import(name, globals, locals, fromlist, level)
ImportError: No module named resources_napoved_rc

Pour tous ceux qui demanderont que j'ai construit un fichier de ressources python:

pyrcc4 -o resources_napoved_rc.py resources_napoved.qrc

Je ne trouve toujours pas de moyen de le faire fonctionner. J'ai toujours la même erreur.

En plus du script, j'ai:

import resources_napoved_rc.py

J'utilise le fichier ui directement depuis qtbuilder. Des idées pour aller de l'avant? Je suppose que cela doit être une sorte de problème de chemin ou quelque chose de similaire.

Greg
la source
No module named resources_napoved_rcet pyrcc4 -o resources_napoved_rc.py resources_napoved.qrcou est-ce une erreur de frappe?
gène
Non, ce n'est pas une faute de frappe. J'ai ajouté le suffixe rc , car il semble qu'il est toujours à la recherche rc à la fin du fichier , même si vous passez file.qrcdans le fichier interface utilisateur. (très étrange) J'ai aussi essayé toutes les combinaisons possibles:pyrcc4 -o resources_napoved_rc.py resources_napoved_rc.qrc
Greg
Essayez de l'importer sans le .py comme ceciimport resources_napoved_rc
Martin

Réponses:

18

Ce problème est dû au fait qu'il uicne fonctionne pas correctement. Je ne sais pas exactement pourquoi, mais je peux montrer les symptômes et une solution de contournement.

Le .uifichier de plugin initial a un resourcesélément vide :

<resources/>

Lorsque vous modifiez les ressources du plugin dans QtDesigner, cela se transforme en:

<resources>
  <include location="resources.qrc"/>
</resources>

C'est la source du problème. Si vous modifiez le fichier .qrc dans cette balise include,resourcesXXX.qrc l'erreur se transforme en No module named resourcesXXX_rc.

Remarque: ce qui suit est basé sur une construction de plugin avec 'test' entré dans tous les champs du générateur de plugins QGIS.

Dans le fichier test_dialog.py , les lignes suivantes compilent le fichier .ui :

FORM_CLASS, _ = uic.loadUiType(os.path.join(
    os.path.dirname(__file__), 'test_dialog_base.ui'))

C'est là que l'erreur se produit.

Modifiez votre .uifichier pour y revenir <resources/>et le problème est résolu. Jusqu'à ce que vous modifiiez à nouveau votre boîte de dialogue dans QtDesigner. Vous devez effectuer cette modification dans le .uifichier après chaque modification de votre boîte de dialogue.

La solution à cela est de changer votre plugin pour qu'il fonctionne comme les versions précédentes du plugin fonctionnaient. Cela implique de remplacer l' appel uic et les lignes de classe dans le fichier _dialog.py . Remplacez ces lignes:

FORM_CLASS, _ = uic.loadUiType(os.path.join(
    os.path.dirname(__file__), 'test_dialog_base.ui'))

class testDialog(QtGui.QDialog, FORM_CLASS):

avec:

from test_dialog_base import Ui_testDialogBase

class testDialog(QDockWidget, Ui_testDialogBase):

Vous devrez maintenant exécuter

pyuic4 -x test_dialog_base.ui > test_dialog_base.py

lorsque vous créez votre plugin pour la première fois et à chaque fois que vous modifiez votre boîte de dialogue de plugin avec QtDesigner. C'était l'ancienne méthode du plugin.

Que ce soit pour éditer le .uifichier ou le lancer à pyuic4chaque fois, c'est votre choix.

Worth Lutz
la source
MaryBeth, l'élément `resources doit être un élément vide, pas une balise de fermeture de cet élément.
mariotomo
9

Vous pouvez éviter d'avoir à modifier le fichier .ui ou la compilation, etc. en procédant comme suit:

import sys
sys.path.append(os.path.dirname(__file__))
FORM_CLASS, _ = uic.loadUiType(os.path.join(
    os.path.dirname(__file__), 'test_dialog_base.ui'), resource_suffix='')

par défaut, resource_suffix est «_rc», c'est pourquoi il recherche toujours «resources_rc». (vous pouvez toujours le laisser par défaut si vous voulez vraiment utiliser resources_rc, bien sûr)

Et l'ajout du chemin du fichier .ui à sys.path permet à python de trouver resources.py. Vous penseriez qu'il serait en mesure de le comprendre puisque votre répertoire actuel est censé être dans sys.path (et que les autres importations de votre répertoire actuel fonctionnent), mais ce n'est pas le cas. Je n'y ai pas suffisamment réfléchi pour comprendre exactement pourquoi.

Jason Hight
la source
8

Je l'ai finalement réparé après 3 heures d'essais. Comme quelqu'un l'a dit, QT Designer ajoute

<resources> <include location="resources.qrc"/> </resources>

à votre fichier d'interface utilisateur. J'ai simplement supprimé ces lignes et tout fonctionne bien (les ressources sont visibles dans l'interface graphique)

Étudiant Michal Wloga
la source
C'est toujours un problème avec QGIS 2.14, donc cela et la réponse de Worth Lutz ont beaucoup aidé!
Andreas Müller
2

Je pense que la réponse courte à ce problème est que les gens chargent le projet directement dans QGIS au lieu d'exécuter:

make deploy

Le fichier resources.pyest généré uniquement après la première make deployexécution.

tobias47n9e
la source
2

Voici comment j'ai résolu le problème:

  • Exécuter-> cmd

  • Accédez à l'emplacement de votre générateur de plug-in (par exemple: c: /users/rafik_pc/.qgis2/python/plugins/pluginbuilder)

  • tapez la commande suivante:

    pyrcc4 -py2 resources.qrc -o resources.py

(J'ai utilisé -py2 parce que j'utilise python 2.7)

  • redémarrez votre QGIS.

  • TERMINÉ.

Chinwi85
la source
0

Ce qui a fonctionné pour moi à la fin était d'utiliser des ressources originales qui sont venues lorsque j'ai créé un package avec le plugin builder et de l'utiliser dans toutes les autres boîtes de dialogue de mon plugin. Je ne sais toujours pas pourquoi l'icône principale de mon plugin change lors du rechargement du plugin, mais j'obtiens toujours des graphiques dans d'autres boîtes de dialogue.

Je souhaite que ce soit différent pour de nombreuses raisons. Pour construire un plugin simple, cette approche fonctionne probablement. C'est un truc d'organisation.

Depuis que j'ai eu tellement de problèmes avec ces ressources, j'ai créé resources.py et resources_rc.py, c'est probablement pourquoi j'ai des problèmes lors du rechargement.

Je n'ai pas le temps de traiter ce problème mais l'équipe de développement QGIS devrait y prêter attention car il bloque les gens pour créer de beaux plugins: D

J'ai fini par faire simple:

import resources

avant d'appeler la classe UI.

Merci de m'avoir aidé avec ce gâchis.

PS: vous devez "compiler" vos ressources avant de les ajouter à votre fichier * .ui et utiliser les mêmes ressources -> importer des ressources dans toutes vos boîtes de dialogue de plugin. J'espère que ça aidera quelqu'un.

Greg
la source
0

Exécutez la même commande en utilisant

sudo pyrcc4 -o resources_rc.py resources.qrc

Ça va marcher

osmjit
la source