Plug-in QGIS: Problemas na importação de arquivo de recursos (resources_rc) - o plug-in não carrega - problemas no PATH?

12

Estou construindo o plugin qgis e não consigo encontrar a solução para este erro.

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 que perguntarem, eu criei o arquivo de recursos python:

pyrcc4 -o resources_napoved_rc.py resources_napoved.qrc

Ainda não consigo encontrar uma maneira de fazê-lo funcionar. Eu sempre recebo o mesmo erro.

No topo do script, tenho:

import resources_napoved_rc.py

Estou usando o arquivo da interface do usuário diretamente do qtbuilder. Alguma idéia de como avançar? Estou assumindo que isso deve ser algum tipo de problema de caminho ou algo semelhante.

Greg
fonte
No module named resources_napoved_rce pyrcc4 -o resources_napoved_rc.py resources_napoved.qrcou é um erro de digitação?
gene
Não, não é um erro de digitação. Eu adicionei o sufixo rc porque parece que ele está sempre procurando rc no final do arquivo, mesmo se você passar file.qrcno arquivo da interface do usuário. (muito estranho) Eu tentei todas as combinações possíveis também:pyrcc4 -o resources_napoved_rc.py resources_napoved_rc.qrc
Greg
Tente importá-lo sem o .py como esteimport resources_napoved_rc
Martin

Respostas:

17

Esse problema é causado por uicnão funcionar corretamente. Não sei exatamente por que, mas posso mostrar os sintomas e uma solução alternativa.

O .uiarquivo de plug-in inicial possui um resourceselemento vazio :

<resources/>

Quando você edita os recursos para o plug-in no QtDesigner, isso muda para:

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

Essa é a fonte do problema. Se você alterar o arquivo .qrc na tag de inclusão,resourcesXXX.qrc o erro será alterado para No module named resourcesXXX_rc.

Nota: o seguinte é baseado em uma construção de plug-in com 'test' inserido em todos os campos do construtor de QGIS.

No arquivo test_dialog.py, as seguintes linhas compilam o arquivo .ui :

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

É aqui que o erro está ocorrendo.

Edite seu .uiarquivo para voltar <resources/>e o problema foi resolvido. Até você editar sua caixa de diálogo no QtDesigner novamente. Você deve fazer essa edição no .uiarquivo após cada vez que editar sua caixa de diálogo.

A solução para isso é alterar seu plugin para funcionar como as versões anteriores do plugin funcionaram. Isso envolve a substituição da chamada uic e das linhas da classe no arquivo _dialog.py . Substitua estas linhas:

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

class testDialog(QtGui.QDialog, FORM_CLASS):

com:

from test_dialog_base import Ui_testDialogBase

class testDialog(QDockWidget, Ui_testDialogBase):

Agora você terá que executar

pyuic4 -x test_dialog_base.ui > test_dialog_base.py

quando você cria seu plugin pela primeira vez e sempre que editar sua caixa de diálogo com o QtDesigner. Este era o antigo método de plug-in.

Se você deseja editar o .uiarquivo ou executar pyuic4sempre.

Worth Lutz
fonte
MaryBeth, o elemento `resources deve ser um elemento vazio, não uma tag de fechamento desse elemento.
Mariotomo
9

Você pode evitar ter que editar o arquivo .ui ou compilar, etc, fazendo o seguinte:

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

O resource_suffix é padronizado como '_rc' e é por isso que ele está sempre procurando por 'resources_rc.' (você sempre pode deixá-lo no padrão se realmente quiser usar o resources_rc, é claro)

E anexar o caminho do arquivo .ui ao sys.path permite que o python encontre recursos.py. Você pensaria que seria capaz de descobrir isso, já que seu diretório atual deveria estar no sys.path (e outras importações do seu diretório atual funcionam), mas não é. Eu não examinei o suficiente para descobrir exatamente o porquê.

Jason Hight
fonte
8

Eu finalmente consertei depois de 3 horas de tentativas. Como alguém disse, o QT Designer adiciona

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

para o seu arquivo de interface do usuário. Eu simplesmente apaguei essas linhas e tudo funciona bem (os recursos são visíveis na GUI)

Student Michal Wloga
fonte
Ainda é um problema com o QGIS 2.14, portanto, essa resposta de Worth Lutz ajudou muito!
Andreas Müller
2

Eu acho que a resposta curta para esse problema é que as pessoas estão carregando o projeto diretamente no QGIS em vez de executar:

make deploy

O arquivo resources.pyé gerado apenas após a primeira vez que make deployé executado.

tobias47n9e
fonte
2

Foi assim que resolvi o problema:

  • Executar-> cmd

  • Vá para o local do seu construtor de plugins (ou seja: c: /users/rafik_pc/.qgis2/python/plugins/pluginbuilder)

  • digite o seguinte comando:

    pyrcc4 -py2 resources.qrc -o resources.py

(Eu usei -py2 porque estou usando python 2.7)

  • reinicie o seu QGIS.

  • FEITO.

Chinwi85
fonte
0

O que funcionou para mim no final foi usar os recursos originais que surgiram quando eu criei o pacote com o construtor de plugins e usá-lo em todas as outras caixas de diálogo do meu plugin. Ainda não sei por que o ícone principal do meu plug-in muda ao recarregar o plug-in, mas ainda recebo gráficos em outras caixas de diálogo.

Eu gostaria que isso fosse diferente por vários motivos. Para criar plugins simples, essa abordagem provavelmente funciona. É uma coisa de organização.

Como eu tive tantos problemas com esses recursos, criei resources.py e resources_rc.py e provavelmente é por isso que tenho problemas ao recarregar.

Não tenho tempo para lidar com esse problema, mas a equipe de desenvolvimento do QGIS deve prestar atenção, pois impede as pessoas de criar plugins bonitos: D

O que acabei fazendo é simples:

import resources

antes de chamar a classe da interface do usuário.

Obrigado por me ajudar com essa bagunça.

PS: você precisa "compilar" seus recursos antes de adicioná-los ao seu arquivo * .ui e usar os mesmos recursos -> importar recursos em todas as caixas de diálogo de seu plug-in. Espero que isso ajude alguém.

Greg
fonte
0

Execute o mesmo comando usando

sudo pyrcc4 -o resources_rc.py resources.qrc

Vai funcionar

osmjit
fonte