QGIS 플러그인 : 리소스 (resources_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

묻는 모든 사람들을 위해 파이썬 리소스 파일을 만들었습니다.

pyrcc4 -o resources_napoved_rc.py resources_napoved.qrc

여전히 작동시킬 방법을 찾을 수 없습니다. 나는 항상 같은 오류가 발생합니다.

나는 스크립트 위에 :

import resources_napoved_rc.py

qtbuilder에서 직접 ui 파일을 사용하고 있습니다. 어떤 아이디어가 앞으로 나아갈 것인가? 나는 이것이 일종의 경로 문제 또는 이와 유사한 것이어야한다고 가정하고있다.


No module named resources_napoved_rc그리고 pyrcc4 -o resources_napoved_rc.py resources_napoved.qrc타이핑 오류입니까?
유전자

아니요 오타가 아닙니다. file.qrcUI 파일 을 전달하더라도 파일 끝에서 항상 rc를 찾는 것처럼 보이기 때문에 rc 접미사를 추가했습니다 . (매우 이상합니다) 가능한 모든 조합을 시도했습니다 :pyrcc4 -o resources_napoved_rc.py resources_napoved_rc.qrc
Greg

이런 식으로 .py없이 가져 오십시오import resources_napoved_rc
Martin

답변:


19

이 문제는 uic제대로 작동하지 않기 때문에 발생합니다 . 나는 왜 정확한지 잘 모르겠지만 증상과 해결책을 보여줄 수 있습니다.

초기 플러그인 .ui파일에는 빈 resources요소가 있습니다.

<resources/>

QtDesigner에서 플러그인의 리소스를 편집하면 다음과 같이 변경됩니다.

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

이것이 문제의 원인입니다. 포함 태그 의 .qrc 파일을 resourcesXXX.qrc오류로 변경하면 오류로 변경됩니다 No module named resourcesXXX_rc.

참고 : 다음은 QGIS 플러그인 빌더의 모든 필드에 'test'를 입력 한 플러그인 빌드를 기반으로합니다.

에서 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 요소는 해당 요소의 닫는 태그가 아닌 빈 요소 여야합니다.
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='')

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>

UI 파일에. 나는 단순히 그 행을 삭제하고 모든 것이 잘 작동합니다 (GUI에서 리소스가 표시됨)


그것은 여전히 ​​QGIS 2.14의 문제이므로 이것과 Worth Lutz의 답변이 많은 도움이되었습니다!
Andreas Müller

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

(파이썬 2.7을 사용하고 있기 때문에 -py2를 사용했습니다)

  • QGIS를 다시 시작하십시오.

  • 끝난.


0

결국 나를 위해 일한 것은 플러그인 빌더로 패키지를 만들 때 온 원래 리소스를 사용하고 플러그인의 다른 모든 대화 상자에서 사용하는 것이 었습니다. 플러그인을 다시로드 할 때 여전히 플러그인의 기본 아이콘이 변경되는 이유를 모르지만 여전히 다른 대화 상자에서 그래픽을 얻습니다.

여러 가지 이유로 이것이 달라지기를 바랍니다. 간단한 플러그인을 구축하려면이 방법이 효과적입니다. 조직적인 것입니다.

이 리소스에 너무 많은 문제가 있었기 때문에 resources.py 및 resources_rc.py를 만들었으므로 아마도 다시로드 할 때 문제가 발생합니다.

나는이 문제를 해결할 시간이 없지만 QGIS dev 팀은 사람들이 아름다운 플러그인을 만들 수 없도록 차단하기 때문에주의를 기울여야합니다.

내가 한 일은 간단하게하는 것입니다.

import resources

UI 클래스를 호출하기 전에

이 혼란을 도와 주셔서 감사합니다.

추신 : * .ui 파일에 리소스를 추가하기 전에 리소스를 "컴파일"하고 모든 플러그인 대화 상자에서 동일한 리소스 사용-> 리소스 가져 오기를 사용해야합니다. 나는 이것이 누군가를 돕기를 바랍니다.


0

다음을 사용하여 동일한 명령을 실행하십시오.

sudo pyrcc4 -o resources_rc.py resources.qrc

작동합니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.