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


13

Я будую плагін 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

Я використовую файл ui безпосередньо з qtbuilder. Будь-які ідеї, як рухатись вперед? Я припускаю, що це повинна бути якась проблема шляху чи щось подібне.


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
Мартін

Відповіді:


19

Ця проблема викликана uicнеправильною роботою. Я не впевнений, чому саме, але я можу показати симптоми та рішення.

Початковий .uiфайл плагіна містить порожній resourcesелемент:

<resources/>

Коли ви редагуєте ресурси для плагіна в QtDesigner, це змінюється на:

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

Це джерело проблеми. Якщо ви зміните файл .qrc, що включає тег, resourcesXXX.qrcпомилка зміниться на No module named resourcesXXX_rc.

Примітка: Далі базується на побудові плагінів із "тестом", введеним у всі поля конструктора плагінів 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, елемент `ресурс повинен бути порожнім елементом, а не завершальним тегом цього елемента.
mariotomo

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

default_suffix за замовчуванням "_rc", тому він завжди шукає "resource_rc." (Ви завжди можете просто залишити його за замовчуванням, якщо дійсно хочете, звичайно, використовувати ресурси_rc)

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


8

Я остаточно виправив це через 3 години спроб. Як хтось сказав QT Designer додає

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

у файл UI. Я просто видалив ці рядки і все працює добре (ресурси видно в графічному інтерфейсі)


Це все ще проблема з QGIS 2.14, тому ця відповідь і Варта Лутца дуже допомогла!
Андреас Мюллер

2

Я думаю, що коротка відповідь на цю проблему полягає в тому, що люди завантажують проект безпосередньо в QGIS замість запуску:

make deploy

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


2

Ось як я вирішив проблему:

  • Виконати-> cmd

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

  • введіть таку команду:

    pyrcc4 -py2 resources.qrc -o resources.py

(Я використовував -py2, тому що я використовую python 2.7)

  • перезапустіть QGIS.

  • Зроблено.


0

Нарешті, для мене спрацювало використання оригінальних ресурсів, які з’явились, коли я створював пакунок із програмою-конструктором плагінів, і використовувати його у всіх інших діалогах мого плагіна. Я досі не знаю, чому основна ікона мого плагіна змінюється при перезавантаженні плагіна, але все ж я отримую графіку в інших діалогах.

Я б хотів, щоб це було різним з багатьох причин. Для побудови простого плагіна такий підхід, ймовірно, працює. Це організація.

Оскільки у мене було стільки проблем з цими ресурсами, я створив resource.py та resource_rc.py, тому, мабуть, тому у мене виникають проблеми при перезавантаженні.

Я не встигаю вирішити цю проблему, але команда розробників QGIS повинна приділити їй деяку увагу, оскільки вона блокує людей робити красиві плагіни: D

Що я в кінцевому підсумку робив - це просто:

import resources

перед викликом класу інтерфейсу користувача

Дякуємо, що допомогли мені в цьому безладі.

PS: перед тим, як додати їх у свій файл * .ui, ви повинні "зібрати" свої ресурси та використовувати ті самі ресурси -> імпорт ресурсів у всіх діалогових вікнах плагінів. Я сподіваюся, що це комусь допоможе.


0

Виконайте ту саму команду, використовуючи

sudo pyrcc4 -o resources_rc.py ресурси.qrc

Це спрацює

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.