Plugin QGIS: Sự cố khi nhập tệp tài nguyên (resource_rc) - plugin không tải - Vấn đề PATH?


12

Tôi đang xây dựng plugin qgis và tôi không thể tìm thấy giải pháp cho lỗi này.

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

Đối với mọi người sẽ hỏi tôi đã xây dựng tệp tài nguyên python:

pyrcc4 -o resources_napoved_rc.py resources_napoved.qrc

Tôi vẫn không thể tìm ra cách để nó hoạt động. Tôi luôn luôn nhận được cùng một lỗi.

Trên đầu tập lệnh tôi có:

import resources_napoved_rc.py

Tôi đang sử dụng tập tin ui trực tiếp từ qtbuilder. Bất kỳ ý tưởng làm thế nào để đi về phía trước? Tôi cho rằng đây phải là một loại vấn đề đường dẫn hoặc một cái gì đó tương tự.


No module named resources_napoved_rcpyrcc4 -o resources_napoved_rc.py resources_napoved.qrcđó là một lỗi đánh máy?
gen

Không, đó không phải là một lỗi đánh máy. Tôi đã thêm hậu tố RC vì có vẻ như nó luôn tìm kiếm RC ở cuối tệp ngay cả khi bạn chuyển qua file.qrctệp UI. (rất lạ) Tôi cũng đã thử tất cả các kết hợp có thể:pyrcc4 -o resources_napoved_rc.py resources_napoved_rc.qrc
Greg

Hãy thử nhập nó mà không có .py như thế nàyimport resources_napoved_rc
Martin

Câu trả lời:


17

Vấn đề này là do uickhông hoạt động đúng. Tôi không chắc chắn chính xác tại sao nhưng tôi có thể hiển thị các triệu chứng và cách giải quyết.

Tệp plugin ban đầu .uicó một resourcesphần tử trống :

<resources/>

Khi bạn chỉnh sửa tài nguyên cho plugin trong QtDesigner, điều này sẽ thay đổi thành:

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

Đây là nguồn gốc của vấn đề. Nếu bạn thay đổi tệp .qrc trong thẻ bao gồmresourcesXXX.qrc lỗi thì lỗi sẽ thay đổi thành No module named resourcesXXX_rc.

Lưu ý: những điều sau đây dựa trên việc xây dựng plugin với 'test' được nhập vào tất cả các trường của trình tạo plugin QGIS.

Trong tệp test_dialog.py , các dòng sau sẽ biên dịch tệp .ui :

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

Đây là nơi xảy ra lỗi.

Chỉnh sửa .uitập tin của bạn để thay đổi trở lại <resources/>và vấn đề được giải quyết. Cho đến khi bạn chỉnh sửa hộp thoại của mình trong QtDesigner một lần nữa. Bạn phải thực hiện chỉnh sửa này thành .uitệp sau mỗi lần bạn chỉnh sửa hộp thoại của mình.

Giải pháp cho vấn đề này là thay đổi plugin của bạn để hoạt động như các phiên bản trước đó của plugin đã hoạt động. Điều này liên quan đến việc thay thế cuộc gọi uic và các dòng lớp trong tệp _dialog.py . Thay thế các dòng này:

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

class testDialog(QtGui.QDialog, FORM_CLASS):

với:

from test_dialog_base import Ui_testDialogBase

class testDialog(QDockWidget, Ui_testDialogBase):

Bây giờ bạn sẽ phải chạy

pyuic4 -x test_dialog_base.ui > test_dialog_base.py

khi bạn lần đầu tiên tạo plugin và mỗi lần bạn chỉnh sửa hộp thoại plugin bằng QtDesigner. Đây là phương pháp plugin cũ.

Cho dù chỉnh sửa .uitập tin hay chạy pyuic4mỗi lần là lựa chọn của bạn.


MaryBeth, phần tử `resource phải là một phần tử rỗng, không phải là thẻ đóng của phần tử đó.
mariotomo

9

Bạn có thể tránh phải chỉnh sửa tệp .ui hoặc biên dịch, v.v. bằng cách thực hiện như sau:

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 mặc định là '_rc', đó là lý do tại sao nó luôn tìm kiếm 'resource_rc.' (dĩ nhiên bạn luôn có thể để nó ở chế độ mặc định nếu bạn thực sự muốn sử dụng resource_rc)

Và việc thêm đường dẫn của tệp .ui vào sys.path cho phép python tìm tài nguyên. Bạn sẽ nghĩ rằng nó sẽ có thể tìm ra vì thư mục hiện tại của bạn được cho là trong sys.path (và các nhập khác từ thư mục hiện tại của bạn hoạt động), nhưng không. Tôi chưa nhìn vào nó đủ để hiểu chính xác tại sao.


8

Cuối cùng tôi đã sửa nó sau 3 giờ cố gắng. Như ai đó đã nói, QT Designer cho biết thêm

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

vào tập tin UI của bạn. Tôi chỉ đơn giản xóa những hàng đó và mọi thứ đều hoạt động tốt (tài nguyên được hiển thị trong GUI)


Đây vẫn là một vấn đề với QGIS 2.14, vì vậy câu trả lời này và Worth Lutz đã giúp ích rất nhiều!
Andreas Müller

2

Tôi nghĩ rằng câu trả lời ngắn cho vấn đề này là mọi người đang tải dự án trực tiếp vào QGIS thay vì chạy:

make deploy

Tập tin resources.pychỉ được tạo sau lần make deploychạy đầu tiên .


2

Đây là cách tôi khắc phục sự cố:

  • Chạy-> cmd

  • Đi đến vị trí của trình tạo plugin của bạn (ví dụ: c: /users/rafik_pc/.qgis2/python/plugins/pluginbuilder)

  • gõ lệnh sau:

    pyrcc4 -py2 resources.qrc -o resources.py

(Tôi đã sử dụng -py2 vì tôi đang sử dụng python 2.7)

  • khởi động lại QGIS của bạn.

  • LÀM XONG.


0

Điều cuối cùng làm việc cho tôi là sử dụng các tài nguyên ban đầu khi tôi tạo gói với trình tạo plugin và sử dụng nó trong tất cả các hộp thoại khác của plugin. Tôi vẫn không biết tại sao biểu tượng chính của plugin thay đổi khi tải lại plugin, nhưng tôi vẫn nhận được đồ họa trong các hộp thoại khác.

Tôi ước điều này sẽ khác đi vì nhiều lý do. Để xây dựng plugin đơn giản, phương pháp này có thể hoạt động. Đó là một điều tổ chức.

Vì tôi có quá nhiều vấn đề với tài nguyên này, tôi đã tạo tài nguyên và tài nguyên_rc.py có lẽ là lý do khiến tôi gặp sự cố khi tải lại.

Tôi không có thời gian để giải quyết vấn đề này, nhưng nhóm phát triển của QGIS nên chú ý đến nó vì nó chặn mọi người tạo ra các plugin đẹp: D

Điều cuối cùng tôi làm là đơn giản:

import resources

trước khi gọi lớp UI.

Cảm ơn đã giúp tôi với mớ hỗn độn này.

PS: bạn phải "biên dịch" tài nguyên của mình trước khi thêm chúng vào tệp * .ui và sử dụng cùng một tài nguyên -> nhập tài nguyên trong tất cả các hộp thoại plugin của bạn. Tôi hi vọng điêu nay se giup được ai đo.


0

Thực hiện cùng một lệnh bằng cách sử dụng

sudo pyrcc4 -o resource_rc.py resource.qrc

Nó sẽ làm việc

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.