Plug-in QGIS: Problemi nell'importazione del file delle risorse (resources_rc) - il plug-in non viene caricato - problemi PATH?


12

Sto costruendo il plugin qgis e non riesco a trovare la soluzione per questo errore.

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

Per tutti coloro che chiederanno di aver creato il file di risorse di Python:

pyrcc4 -o resources_napoved_rc.py resources_napoved.qrc

Non riesco ancora a trovare un modo per farlo funzionare. Ottengo sempre lo stesso errore.

Oltre allo script ho:

import resources_napoved_rc.py

Sto usando il tuo file UI direttamente da qtbuilder. Qualche idea su come andare avanti? Suppongo che questo debba essere una sorta di problema di percorso o qualcosa di simile.


No module named resources_napoved_rce pyrcc4 -o resources_napoved_rc.py resources_napoved.qrco è un errore di battitura?
gene

No, non è un refuso. Ho aggiunto il suffisso rc perché sembra che cerchi sempre rc alla fine del file anche se si passa file.qrcal file UI. (molto strano) Ho provato anche tutte le possibili combinazioni:pyrcc4 -o resources_napoved_rc.py resources_napoved_rc.qrc
Greg

Prova a importarlo senza il .py in questo modoimport resources_napoved_rc
Martin

Risposte:


18

Questo problema è causato dal uicmancato funzionamento corretto. Non sono sicuro del perché, ma posso mostrare i sintomi e una soluzione alternativa.

Il .uifile del plugin iniziale ha un resourceselemento vuoto :

<resources/>

Quando modifichi le risorse per il plugin in QtDesigner, questo cambia in:

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

Questa è la fonte del problema. Se si modifica il file .qrc in quel tag di inclusione,resourcesXXX.qrc l'errore cambierà in No module named resourcesXXX_rc.

Nota: quanto segue si basa su una compilazione di plug-in con 'test' inserito in tutti i campi del generatore di plug-in QGIS.

Nel file test_dialog.py le seguenti righe compilano il file .ui :

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

Questo è dove si verifica l'errore.

Modifica il tuo .uifile per tornare a <resources/>e il problema è stato risolto. Fino a quando non modifichi nuovamente la finestra di dialogo in QtDesigner. È necessario apportare questa modifica al .uifile dopo ogni modifica della finestra di dialogo.

La soluzione a questo è di cambiare il tuo plugin in modo che funzioni come funzionavano le versioni precedenti del plugin. Ciò comporta la sostituzione della chiamata uic e delle linee di classe nel file _dialog.py . Sostituisci queste righe:

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

class testDialog(QtGui.QDialog, FORM_CLASS):

con:

from test_dialog_base import Ui_testDialogBase

class testDialog(QDockWidget, Ui_testDialogBase):

Ora dovrai correre

pyuic4 -x test_dialog_base.ui > test_dialog_base.py

quando si crea il plug-in per la prima volta e ogni volta si modifica la finestra di dialogo del plug-in con QtDesigner. Questo era il vecchio metodo di plugin.

È possibile scegliere se modificare il .uifile o eseguire pyuic4ogni volta.


MaryBeth, l'elemento `resources dovrebbe essere un elemento vuoto, non un tag di chiusura di quell'elemento.
mariotomo,

9

È possibile evitare di dover modificare il file .ui o la compilazione, ecc. Procedendo come segue:

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 viene impostato automaticamente su "_rc", motivo per cui cerca sempre "risorse_rc". (puoi sempre lasciarlo per impostazione predefinita se vuoi davvero usare resources_rc, ovviamente)

E aggiungendo il percorso del file .ui a sys.path consente a python di trovare resources.py. Penseresti che sarebbe in grado di capirlo dal momento che la tua directory corrente dovrebbe essere in sys.path (e altre importazioni dalla tua directory corrente funzionano), ma non lo fa. Non ho esaminato abbastanza per capire esattamente il perché.


8

Alla fine l'ho risolto dopo 3 ore di prova. Come qualcuno ha detto QT Designer aggiunge

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

al tuo file UI. Ho semplicemente eliminato quelle righe e tutto funziona bene (le risorse sono visibili nella GUI)


È ancora un problema con QGIS 2.14, quindi questa e la risposta di Worth Lutz mi hanno aiutato molto!
Andreas Müller,

2

Penso che la risposta breve a questo problema sia che le persone stanno caricando il progetto direttamente in QGIS invece di eseguirlo:

make deploy

Il file resources.pyviene generato solo dopo la prima make deployesecuzione.


2

Ecco come ho risolto il problema:

  • Run-> cmd

  • Vai alla posizione del tuo generatore di plug-in (ad esempio: c: /users/rafik_pc/.qgis2/python/plugins/pluginbuilder)

  • digitare il seguente comando:

    pyrcc4 -py2 resources.qrc -o resources.py

(Ho usato -py2 perché sto usando Python 2.7)

  • riavvia QGIS.

  • FATTO.


0

Ciò che ha funzionato per me alla fine è stato usare le risorse originali che sono venute quando ho creato il pacchetto con il generatore di plugin e usarlo in tutte le altre finestre di dialogo del mio plugin. Non so ancora perché l'icona principale del mio plug-in cambi quando si ricarica il plug-in, ma continuo a ottenere grafica in altre finestre di dialogo.

Vorrei che questo fosse diverso per molte ragioni. Per creare un semplice plugin questo approccio probabilmente funziona. È una cosa dell'organizzazione.

Dato che ho avuto così tanti problemi con queste risorse, ho creato resources.py e resources_rc.py, probabilmente è questo il motivo per cui ottengo problemi durante il ricaricamento.

Non ho tempo per affrontare questo problema, ma il team di sviluppo di QGIS dovrebbe prestare attenzione ad esso poiché blocca le persone a creare bellissimi plugin: D

Quello che ho finito per fare è avere semplici:

import resources

prima di chiamare la classe UI.

Grazie per avermi aiutato con questo casino.

PS: devi "compilare" le tue risorse prima di aggiungerle al tuo file * .ui e usare usa le stesse risorse -> importa risorse in tutte le finestre di dialogo del plugin. Spero che questo aiuti qualcuno.


0

Eseguire lo stesso comando utilizzando

sudo pyrcc4 -o resources_rc.py resources.qrc

Funzionerà

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.