Complemento QGIS: Problemas al importar el archivo de recursos (resources_rc) - el complemento no se carga - ¿Problemas de RUTA?

12

Estoy construyendo el complemento qgis y no puedo encontrar la solución para este error.

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

Para todos los que preguntarán, he creado el archivo de recursos de Python:

pyrcc4 -o resources_napoved_rc.py resources_napoved.qrc

Todavía no puedo encontrar una manera de hacerlo funcionar. Siempre recibo el mismo error.

Además del guión tengo:

import resources_napoved_rc.py

Estoy usando el archivo ui directamente desde qtbuilder. ¿Alguna idea de cómo seguir adelante? Supongo que esto debe ser algún tipo de problema de ruta o algo similar.

Greg
fuente
No module named resources_napoved_rcy pyrcc4 -o resources_napoved_rc.py resources_napoved.qrco es un error de tipeo?
Gene
No, no es un error tipográfico. Agregué el sufijo rc porque parece que siempre está buscando rc al final del archivo, incluso si pasa el file.qrcarchivo UI. (Muy extraño) También probé todas las combinaciones posibles:pyrcc4 -o resources_napoved_rc.py resources_napoved_rc.qrc
Greg
Intenta importarlo sin el .py como esteimport resources_napoved_rc
Martin

Respuestas:

18

Este problema se debe a que uicno funciona correctamente. No estoy seguro exactamente por qué, pero puedo mostrar los síntomas y una solución alternativa.

El .uiarchivo de complemento inicial tiene un resourceselemento vacío :

<resources/>

Cuando edita los recursos para el complemento en QtDesigner, esto cambia a:

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

Esta es la fuente del problema. Si cambia el archivo .qrc en esa etiqueta de inclusión,resourcesXXX.qrc el error cambiará a No module named resourcesXXX_rc.

Nota: lo siguiente se basa en una compilación de complementos con 'prueba' ingresada en todos los campos del generador de complementos QGIS.

En el archivo test_dialog.py , las siguientes líneas compilan el archivo .ui :

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

Aquí es donde está ocurriendo el error.

Edite su .uiarchivo para volver a cambiar <resources/>y el problema se resuelve. Hasta que edite su diálogo en QtDesigner nuevamente. Debe realizar esta edición en el .uiarchivo cada vez que edite su cuadro de diálogo.

La solución a esto es cambiar su complemento para que funcione como funcionaban las versiones anteriores del complemento. Esto implica reemplazar la llamada uic y las líneas de clase en el archivo _dialog.py . Reemplace estas líneas:

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):

Ahora tendrás que correr

pyuic4 -x test_dialog_base.ui > test_dialog_base.py

cuando cree su complemento por primera vez y cada vez que edite su diálogo de complemento con QtDesigner. Este era el antiguo método de complemento.

Si desea editar el .uiarchivo o ejecutar pyuic4cada vez es su elección.

Worth Lutz
fuente
MaryBeth, el elemento `resources debería ser un elemento vacío, no una etiqueta de cierre de ese elemento.
mariotomo
9

Puede evitar tener que editar el archivo .ui o compilar, etc. haciendo lo siguiente:

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 tiene como valor predeterminado '_rc', por lo que siempre está buscando 'resources_rc'. (siempre puede dejarlo por defecto si realmente quiere usar resources_rc, por supuesto)

Y agregar la ruta del archivo .ui a sys.path le permite a python encontrar resources.py. Pensarías que sería capaz de resolverlo ya que se supone que tu directorio actual está en sys.path (y otras importaciones de tu directorio actual funcionan), pero no lo hace. No lo he investigado lo suficiente como para entender exactamente por qué.

Jason Hight
fuente
8

Finalmente lo arreglé después de 3 horas de intentarlo. Como alguien dijo, QT Designer agrega

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

a su archivo de UI. Simplemente eliminé esas filas y todo funciona bien (los recursos son visibles en la GUI)

Estudiante michal wloga
fuente
Todavía es un problema con QGIS 2.14, ¡así que esto y la respuesta de Worth Lutz ayudaron mucho!
Andreas Müller
2

Creo que la respuesta breve a este problema es que las personas están cargando el proyecto directamente en QGIS en lugar de ejecutarlo:

make deploy

El archivo resources.pysolo se genera después de la primera vez que make deployse ejecuta.

tobias47n9e
fuente
2

Así es como solucioné el problema:

  • Ejecutar-> cmd

  • Vaya a la ubicación de su generador de complementos (es decir: c: /users/rafik_pc/.qgis2/python/plugins/pluginbuilder)

  • escriba el siguiente comando:

    pyrcc4 -py2 resources.qrc -o resources.py

(Usé -py2 porque estoy usando python 2.7)

  • reinicie su QGIS.

  • HECHO.

Chinwi85
fuente
0

Lo que funcionó para mí al final fue usar recursos originales que surgieron cuando creé el paquete con el generador de complementos y usarlo en todos los demás cuadros de diálogo de mi complemento. Todavía no sé por qué cambia el ícono principal de mi complemento al volver a cargar el complemento, pero sigo teniendo gráficos en otros cuadros de diálogo.

Desearía que esto fuera diferente por muchas razones. Para construir un complemento simple, este enfoque probablemente funcione. Es una cosa de organización.

Debido a que tuve tantos problemas con estos recursos, he creado resources.py y resources_rc.py probablemente por eso tengo problemas al recargar.

No tengo tiempo para lidiar con este problema, pero el equipo de desarrollo de QGIS debería prestarle atención, ya que bloquea a las personas para hacer hermosos complementos: D

Lo que terminé haciendo es tener algo simple:

import resources

antes de llamar a la clase UI.

Gracias por ayudarme con este desastre.

PD: debe "compilar" sus recursos antes de agregarlos a su archivo * .ui y usar los mismos recursos -> importar recursos en todos sus cuadros de diálogo de complementos. Espero que esto ayude a alguien.

Greg
fuente
0

Ejecute el mismo comando usando

sudo pyrcc4 -o resources_rc.py resources.qrc

Funcionará

osmjit
fuente