Wtyczka QGIS: Problemy z importowaniem pliku zasobów (resources_rc) - wtyczka nie ładuje się - Problemy ze ŚCIEŻKĄ?

13

Buduję wtyczkę qgis i nie mogę znaleźć rozwiązania tego błędu.

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

Dla wszystkich, którzy będą pytać, zbudowałem plik zasobów Pythona:

pyrcc4 -o resources_napoved_rc.py resources_napoved.qrc

Nadal nie mogę znaleźć sposobu, aby to zadziałało. Zawsze pojawia się ten sam błąd.

Oprócz skryptu mam:

import resources_napoved_rc.py

Używam pliku interfejsu użytkownika bezpośrednio z qtbuilder. Wszelkie pomysły, jak iść naprzód? Zakładam, że to musi być jakiś problem ze ścieżką lub coś podobnego.

Greg
źródło
No module named resources_napoved_rci pyrcc4 -o resources_napoved_rc.py resources_napoved.qrcczy to błąd w pisaniu?
gen
Nie, to nie literówka. Dodałem sufiks rc, ponieważ wygląda na to, że zawsze szuka rc na końcu pliku, nawet jeśli przekazujesz file.qrcplik UI. (bardzo dziwne) Próbowałem także wszystkich możliwych kombinacji:pyrcc4 -o resources_napoved_rc.py resources_napoved_rc.qrc
Greg
Spróbuj zaimportować bez takiego pliku .pyimport resources_napoved_rc
Martin

Odpowiedzi:

19

Przyczyną tego problemu jest uicnieprawidłowe działanie. Nie jestem pewien dokładnie, dlaczego, ale mogę pokazać objawy i obejście.

Początkowy .uiplik wtyczki ma pusty resourceselement:

<resources/>

Podczas edycji zasobów wtyczki w QtDesigner zmienia się to na:

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

To jest źródło problemu. Jeśli zmienisz plik .qrc w tym tagu dołączania,resourcesXXX.qrc błąd zmieni się na No module named resourcesXXX_rc.

Uwaga: poniższe informacje są oparte na kompilacji wtyczek z „testem” wprowadzonym we wszystkich polach konstruktora wtyczek QGIS.

W pliku test_dialog.py następujące wiersze kompilują plik .ui :

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

W tym miejscu występuje błąd.

Edytuj .uiplik, aby zmienić z powrotem, <resources/>a problem zostanie rozwiązany. Do czasu ponownej edycji okna dialogowego w QtDesigner. Tę edycję należy wprowadzić do .uipliku po każdej edycji okna dialogowego.

Rozwiązaniem tego jest zmiana wtyczki, aby działała tak, jak działały wcześniejsze wersje wtyczki. Obejmuje to zamianę wywołania interfejsu użytkownika i wierszy klasy w pliku _dialog.py . Zamień te linie:

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

class testDialog(QtGui.QDialog, FORM_CLASS):

z:

from test_dialog_base import Ui_testDialogBase

class testDialog(QDockWidget, Ui_testDialogBase):

Musisz teraz biec

pyuic4 -x test_dialog_base.ui > test_dialog_base.py

kiedy po raz pierwszy tworzysz wtyczkę i za każdym razem edytujesz okno dialogowe wtyczki za pomocą QtDesigner. To była stara metoda wtyczek.

Niezależnie od tego, czy chcesz edytować .uiplik, czy uruchomić za pyuic4każdym razem, wybierasz.

Warto Lutz
źródło
MaryBeth, element `resources powinien być pustym elementem, a nie zamykającym znacznikiem tego elementu.
mariotomo
9

Możesz uniknąć edytowania pliku .ui lub kompilacji itp., Wykonując następujące czynności:

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

Zasób_suffix domyślnie ma wartość „_rc”, dlatego zawsze szuka wyrażenia „resources_rc”. (zawsze możesz zostawić to ustawienie domyślne, jeśli naprawdę chcesz użyć resources_rc, oczywiście)

Dołączenie ścieżki pliku .ui do sys.path pozwala pythonowi znaleźć resources.py. Można by pomyśleć, że będzie w stanie to rozgryźć, ponieważ bieżący katalog powinien znajdować się w sys.path (i inne importy z bieżącego katalogu działają), ale tak nie jest. Nie przyjrzałem się temu wystarczająco, aby dowiedzieć się dokładnie, dlaczego.

Jason Hight
źródło
8

W końcu naprawiłem to po 3 godzinach prób. Jak ktoś powiedział, dodaje QT Designer

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

do pliku interfejsu użytkownika. Po prostu usunąłem te wiersze i wszystko działa dobrze (zasoby są widoczne w GUI)

Student Michał Wloga
źródło
Nadal jest problem z QGIS 2.14, więc ta i warta odpowiedź Lutz bardzo pomogła!
Andreas Müller,
2

Myślę, że krótką odpowiedzią na ten problem jest to, że ludzie ładują projekt bezpośrednio do QGIS zamiast uruchamiać:

make deploy

Plik resources.pyjest generowany dopiero po pierwszym make deployuruchomieniu.

tobias47n9e
źródło
2

W ten sposób naprawiłem problem:

  • Uruchom-> cmd

  • Przejdź do lokalizacji konstruktora wtyczek (np .: c: /users/rafik_pc/.qgis2/python/plugins/pluginbuilder)

  • wpisz następujące polecenie:

    pyrcc4 -py2 resources.qrc -o resources.py

(Użyłem -py2, ponieważ używam Pythona 2.7)

  • zrestartuj swój QGIS.

  • GOTOWE.

Chinwi85
źródło
0

Ostatecznie działało dla mnie wykorzystanie oryginalnych zasobów, które powstały podczas tworzenia pakietu za pomocą konstruktora wtyczek i użycie go we wszystkich innych oknach dialogowych mojej wtyczki. Nadal nie wiem, dlaczego główna ikona mojej wtyczki zmienia się podczas przeładowywania wtyczki, ale nadal dostaję grafikę w innych oknach dialogowych.

Chciałbym, żeby było inaczej z wielu powodów. W przypadku budowy prostej wtyczki takie podejście prawdopodobnie działa. To rzecz organizacyjna.

Ponieważ miałem tak wiele problemów z tymi zasobami, stworzyłem resources.py i resources_rc.py, dlatego prawdopodobnie mam problemy podczas przeładowywania.

Nie mam czasu, aby poradzić sobie z tym problemem, ale zespół deweloperów QGIS powinien zwrócić na to uwagę, ponieważ blokuje ludziom tworzenie pięknych wtyczek: D

Skończyło się na prostym:

import resources

przed wywołaniem klasy interfejsu użytkownika.

Dzięki za pomoc w tym bałaganie.

PS: musisz „skompilować” swoje zasoby przed dodaniem ich do pliku * .ui i użyj tych samych zasobów -> importuj zasoby we wszystkich oknach dialogowych wtyczek. Mam nadzieję, że to komuś pomoże.

Greg
źródło
0

Wykonaj to samo polecenie za pomocą

sudo pyrcc4 -o resources_rc.py resources.qrc

To będzie działać

osmjit
źródło