Плагин QGIS: Проблемы с импортом файла ресурсов (resources_rc) - плагин не загружается - проблемы с PATH?

12

Я создаю плагин qgis и не могу найти решение этой ошибки.

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

Для всех, кто спросит, я создал файл ресурсов Python:

pyrcc4 -o resources_napoved_rc.py resources_napoved.qrc

Я до сих пор не могу найти способ заставить это работать. Я всегда получаю одну и ту же ошибку.

В верхней части сценария у меня есть:

import resources_napoved_rc.py

Я использую пользовательский файл напрямую из qtbuilder. Есть идеи, как идти вперед? Я предполагаю, что это должно быть какая-то проблема пути или что-то подобное.

Greg
источник
No module named resources_napoved_rcи pyrcc4 -o resources_napoved_rc.py resources_napoved.qrcили это ошибка опечатки?
ген
Нет, это не опечатка. Я добавил суффикс rc, потому что, похоже, он всегда ищет rc в конце файла, даже если вы передаете file.qrcфайл UI. (очень странно) Я попробовал также все возможные комбинации:pyrcc4 -o resources_napoved_rc.py resources_napoved_rc.qrc
Грег
Попробуйте импортировать его без .py, как этоimport resources_napoved_rc
Martin

Ответы:

18

Эта проблема вызвана тем, что uicне работает должным образом. Я не уверен точно, почему, но я могу показать симптомы и обходной путь.

Исходный .uiфайл плагина имеет пустой resourcesэлемент:

<resources/>

Когда вы редактируете ресурсы для плагина в QtDesigner, это меняется на:

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

Это источник проблемы. Если вы измените файл .qrc в теге include,resourcesXXX.qrc ошибка изменится на No module named resourcesXXX_rc.

Примечание: следующее основано на сборке плагина с 'test', введенным во все поля компоновщика плагинов QGIS.

В файле test_dialog.py следующие строки компилируют файл .ui :

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

Это где ошибка происходит.

Отредактируйте .uiфайл, чтобы вернуться к нему, <resources/>и проблема будет решена. Пока вы снова не отредактируете свой диалог в QtDesigner. Вы должны сделать это редактирование .uiфайла после каждого редактирования вашего диалога.

Решение этой проблемы заключается в том, чтобы ваш плагин работал так, как работали предыдущие версии плагина. Это включает замену вызова uic и строк класса в файле _dialog.py . Замените эти строки:

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

class testDialog(QtGui.QDialog, FORM_CLASS):

с участием:

from test_dialog_base import Ui_testDialogBase

class testDialog(QDockWidget, Ui_testDialogBase):

Теперь вам придется бежать

pyuic4 -x test_dialog_base.ui > test_dialog_base.py

когда вы впервые создаете свой плагин и каждый раз редактируете его диалог с помощью QtDesigner. Это был старый метод плагинов.

Независимо от того, редактировать ли .uiфайл или запускать pyuic4каждый раз, ваш выбор.

Стоит Лутц
источник
MaryBeth, элемент `resources должен быть пустым элементом, а не закрывающим тегом этого элемента.
Мариотомо
9

Вы можете избежать редактирования файла .ui или компиляции и т. Д., Выполнив следующие действия:

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 по умолчанию равен «_rc», поэтому всегда ищет «resources_rc». (вы всегда можете просто оставить его по умолчанию, если вы действительно хотите использовать resources_rc, конечно)

А добавление пути файла .ui к sys.path позволяет python находить resources.py. Вы могли бы подумать, что он сможет это выяснить, поскольку ваш текущий каталог должен находиться в sys.path (и другие операции импорта из вашей текущей работы с каталогами), но это не так. Я не изучил это достаточно, чтобы понять, почему именно.

Джейсон Хайт
источник
8

Я наконец исправил это после 3 часов попытки. Как кто-то сказал, QT Designer добавляет

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

в ваш файл пользовательского интерфейса. Я просто удалил эти строки, и все работает нормально (ресурсы видны в графическом интерфейсе)

Студент Михал Влога
источник
Это все еще проблема с QGIS 2.14, так что этот ответ и Worth Lutz очень помог!
Андреас Мюллер
2

Я думаю, что краткий ответ на эту проблему заключается в том, что люди загружают проект непосредственно в QGIS, а не запускают:

make deploy

Файл resources.pyгенерируется только после первого make deployзапуска.

tobias47n9e
источник
2

Вот как я исправил проблему:

  • Подвижная> CMD

  • Перейдите в расположение вашего сборщика плагинов (то есть: c: /users/rafik_pc/.qgis2/python/plugins/pluginbuilder)

  • введите следующую команду:

    pyrcc4 -py2 resources.qrc -o resources.py

(Я использовал -py2, потому что я использую Python 2.7)

  • перезапустите свой QGIS.

  • СДЕЛАННЫЙ.

Chinwi85
источник
0

В итоге для меня сработало использование оригинальных ресурсов, которые появились, когда я создал пакет с помощью компоновщика плагинов, и использование его во всех других диалогах моего плагина. Я до сих пор не знаю, почему основной значок моего плагина изменяется при его перезагрузке, но я все равно получаю графику в других диалогах.

Я хотел бы, чтобы это было иначе по многим причинам. Для создания простого плагина этот подход, вероятно, работает. Это организационная штука.

Поскольку у меня было так много проблем с этими ресурсами, я собрал resources.py и resources_rc.py, поэтому, вероятно, у меня возникают проблемы при перезагрузке.

У меня нет времени заниматься этой проблемой, но команда разработчиков QGIS должна обратить на это внимание, так как она мешает людям создавать красивые плагины: D

То, что я закончил в том, чтобы иметь простое:

import resources

перед вызовом класса пользовательского интерфейса.

Спасибо за помощь мне с этим беспорядком.

PS: вам нужно «скомпилировать» ваши ресурсы перед добавлением их в ваш * .ui файл и использовать те же ресурсы -> импортировать ресурсы во все ваши диалоги плагинов. Я надеюсь, что это помогает кому-то.

Greg
источник
0

Выполните ту же команду, используя

sudo pyrcc4 -o resources_rc.py resources.qrc

Это сработает

osmjit
источник