QGIS-Plugin: Probleme beim Importieren der Ressourcendatei (resources_rc) - Plugin wird nicht geladen - PATH-Probleme?

12

Ich erstelle ein QGIS-Plugin und kann keine Lösung für diesen Fehler finden.

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

Für alle, die fragen werden, habe ich eine Python-Ressourcendatei erstellt:

pyrcc4 -o resources_napoved_rc.py resources_napoved.qrc

Ich kann immer noch keinen Weg finden, es zum Laufen zu bringen. Ich bekomme immer den gleichen Fehler.

Oben auf dem Skript habe ich:

import resources_napoved_rc.py

Ich verwende die UI-Datei direkt von qtbuilder. Irgendwelche Ideen, wie es weitergehen soll? Ich gehe davon aus, dass dies eine Art Pfadproblem oder ähnliches sein muss.

Greg
quelle
No module named resources_napoved_rcund pyrcc4 -o resources_napoved_rc.py resources_napoved.qrcoder ist es ein Tippfehler?
Gen
Nein, es ist kein Tippfehler. Ich habe das Suffix rc hinzugefügt, weil es so aussieht, als würde am Ende der Datei immer nach rc gesucht, selbst wenn Sie die file.qrcUI-Datei übergeben. (sehr seltsam) Ich habe auch alle möglichen Kombinationen ausprobiert:pyrcc4 -o resources_napoved_rc.py resources_napoved_rc.qrc
Greg
Versuchen Sie es ohne die .py wie folgt zu importierenimport resources_napoved_rc
Martin

Antworten:

17

Dieses Problem wird dadurch verursacht, dass es uicnicht richtig funktioniert. Ich weiß nicht genau warum, aber ich kann die Symptome und eine Problemumgehung zeigen.

Die anfängliche Plugin- .uiDatei enthält ein leeres resourcesElement:

<resources/>

Wenn Sie die Ressourcen für das Plugin in QtDesigner bearbeiten, ändert sich dies zu:

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

Dies ist die Ursache des Problems. Wenn Sie die .qrc-Datei in diesem Include- Tag resourcesXXX.qrcändern, ändert sich der Fehler in No module named resourcesXXX_rc.

Hinweis: Das Folgende basiert auf einem Plugin-Build, bei dem 'test' in alle Felder des QGIS-Plugin-Builders eingegeben wurde.

In der Datei test_dialog.py kompilieren die folgenden Zeilen die .ui- Datei:

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

Hier tritt der Fehler auf.

Bearbeiten Sie Ihre .uiDatei, um wieder zu wechseln, <resources/>und das Problem ist behoben. Bis Sie Ihren Dialog in QtDesigner erneut bearbeiten. Sie müssen diese Änderung an der .uiDatei nach jedem Bearbeiten Ihres Dialogfelds vornehmen .

Die Lösung hierfür besteht darin, Ihr Plugin so zu ändern, dass es wie frühere Versionen des Plugins funktioniert. Dies beinhaltet das Ersetzen des uic- Aufrufs und der Klassenzeilen in der Datei _dialog.py . Ersetzen Sie diese Zeilen:

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

class testDialog(QtGui.QDialog, FORM_CLASS):

mit:

from test_dialog_base import Ui_testDialogBase

class testDialog(QDockWidget, Ui_testDialogBase):

Sie müssen jetzt laufen

pyuic4 -x test_dialog_base.ui > test_dialog_base.py

Wenn Sie Ihr Plugin zum ersten Mal erstellen und jedes Mal, wenn Sie Ihren Plugin-Dialog mit QtDesigner bearbeiten. Dies war die alte Plugin-Methode.

Sie haben die Wahl, ob Sie die .uiDatei oder den Lauf pyuic4jedes Mal bearbeiten möchten.

Wert Lutz
quelle
MaryBeth, das `resources-Element sollte ein leeres Element sein, kein schließendes Tag dieses Elements.
Mariotomo
9

Sie können vermeiden, dass Sie die .ui-Datei bearbeiten oder kompilieren müssen, indem Sie folgende Schritte ausführen:

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='')

resource_suffix ist standardmäßig '_rc', weshalb immer nach 'resources_rc' gesucht wird. (Sie können die Standardeinstellung jederzeit beibehalten, wenn Sie resources_rc wirklich verwenden möchten.)

Durch Anhängen des Pfads der .ui-Datei an sys.path kann Python die Datei resources.py finden. Sie würden denken, es könnte es herausfinden, da sich Ihr aktuelles Verzeichnis in sys.path befinden soll (und andere Importe aus Ihrem aktuellen Verzeichnis funktionieren), aber das funktioniert nicht. Ich habe nicht genug darüber nachgedacht, um genau herauszufinden, warum.

Jason Hight
quelle
8

Ich habe es endlich behoben, nachdem ich es 3 Stunden lang versucht hatte. Wie jemand sagte, fügt QT Designer hinzu

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

zu Ihrer UI-Datei. Ich habe diese Zeilen einfach gelöscht und alles funktioniert einwandfrei (Ressourcen sind in der GUI sichtbar)

Student Michal Wloga
quelle
Es ist immer noch ein Problem mit QGIS 2.14, daher hat diese und die Antwort von Worth Lutz sehr geholfen!
Andreas Müller
2

Ich denke, die kurze Antwort auf dieses Problem ist, dass die Leute das Projekt direkt in QGIS laden, anstatt es auszuführen:

make deploy

Die Datei resources.pywird erst nach dem ersten make deployAusführen generiert .

tobias47n9e
quelle
2

So habe ich das Problem behoben:

  • Run-> cmd

  • Gehen Sie zum Speicherort Ihres Plugin-Builders (z. B.: C: /users/rafik_pc/.qgis2/python/plugins/pluginbuilder).

  • Geben Sie den folgenden Befehl ein:

    pyrcc4 -py2 resources.qrc -o resources.py

(Ich habe -py2 verwendet, weil ich Python 2.7 verwende.)

  • Starten Sie Ihr QGIS neu.

  • ERLEDIGT.

Chinwi85
quelle
0

Am Ende funktionierte es für mich, die ursprünglichen Ressourcen zu verwenden, die beim Erstellen des Pakets mit dem Plugin Builder entstanden waren, und es in allen anderen Dialogen meines Plugins zu verwenden. Ich weiß immer noch nicht, warum sich das Hauptsymbol meines Plugins beim erneuten Laden des Plugins ändert, aber ich erhalte trotzdem Grafiken in anderen Dialogen.

Ich wünschte, dies wäre aus vielen Gründen anders. Für das Erstellen eines einfachen Plugins funktioniert dieser Ansatz wahrscheinlich. Es ist ein Organisationsdingie.

Da ich so viele Probleme mit diesen Ressourcen hatte, habe ich resources.py und resources_rc.py erstellt. Deshalb bekomme ich wahrscheinlich Probleme beim Neuladen.

Ich habe keine Zeit, mich mit diesem Problem zu befassen, aber das QGIS-Entwicklerteam sollte etwas Aufmerksamkeit darauf richten, da es die Leute daran hindert, schöne Plugins zu erstellen: D.

Was ich letztendlich getan habe, ist einfach zu haben:

import resources

vor dem Aufruf der UI-Klasse.

Danke, dass du mir bei diesem Durcheinander geholfen hast.

PS: Sie müssen Ihre Ressourcen "kompilieren", bevor Sie sie zu Ihrer * .ui-Datei hinzufügen, und dieselben Ressourcen verwenden -> Ressourcen in all Ihren Plugin-Dialogen importieren. Ich hoffe das hilft jemandem.

Greg
quelle
0

Führen Sie den gleichen Befehl mit aus

sudo pyrcc4 -o resources_rc.py resources.qrc

Es wird klappen

Osmjit
quelle