Plugin QGIS: Masalah mengimpor file resources (resources_rc) - plugin tidak memuat - masalah PATH?

12

Saya sedang membangun plugin qgis dan saya tidak dapat menemukan solusi untuk kesalahan ini.

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

Untuk semua orang yang akan bertanya saya telah membangun file sumber python:

pyrcc4 -o resources_napoved_rc.py resources_napoved.qrc

Saya masih tidak dapat menemukan cara untuk membuatnya bekerja. Saya selalu mendapatkan kesalahan yang sama.

Di atas skrip yang saya miliki:

import resources_napoved_rc.py

Saya menggunakan file ui langsung dari qtbuilder. Ada ide bagaimana cara maju? Saya berasumsi ini pasti semacam masalah jalur atau sesuatu yang serupa.

Greg
sumber
No module named resources_napoved_rcdan pyrcc4 -o resources_napoved_rc.py resources_napoved.qrcatau apakah itu kesalahan pengetikan?
gen
Tidak, itu bukan salah ketik. Saya menambahkan akhiran rc karena kelihatannya selalu mencari rc di akhir file bahkan jika Anda memasukkan file file.qrcUI. (sangat aneh) Saya mencoba semua kemungkinan kombinasi juga:pyrcc4 -o resources_napoved_rc.py resources_napoved_rc.qrc
Greg
Cobalah mengimpornya tanpa .py seperti iniimport resources_napoved_rc
Martin

Jawaban:

17

Masalah ini disebabkan karena uictidak berfungsi dengan baik. Saya tidak yakin persis mengapa tetapi saya bisa menunjukkan gejala dan solusinya.

.uiFile plugin awal memiliki resourceselemen kosong :

<resources/>

Ketika Anda mengedit sumber daya untuk plugin di QtDesigner ini berubah menjadi:

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

Ini adalah sumber masalahnya. Jika Anda mengubah file .qrc di yang menyertakan tag ke resourcesXXX.qrckesalahan akan berubah menjadi No module named resourcesXXX_rc.

Catatan: berikut ini didasarkan pada pembuatan plugin dengan 'test' dimasukkan ke semua bidang pembuat plugin QGIS.

Dalam test_dialog.py file baris berikut mengkompilasi Ui berkas:

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

Di sinilah kesalahan terjadi.

Edit .uifile Anda untuk diubah kembali <resources/>dan masalahnya teratasi. Sampai Anda mengedit dialog Anda di QtDesigner lagi. Anda harus mengedit ini ke .uifile setelah setiap kali Anda mengedit dialog Anda.

Solusi untuk ini adalah mengubah plugin Anda agar berfungsi seperti versi sebelumnya dari plugin yang berfungsi. Ini termasuk mengganti panggilan uic dan baris kelas dalam file _dialog.py . Ganti baris ini:

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

class testDialog(QtGui.QDialog, FORM_CLASS):

dengan:

from test_dialog_base import Ui_testDialogBase

class testDialog(QDockWidget, Ui_testDialogBase):

Anda sekarang harus berlari

pyuic4 -x test_dialog_base.ui > test_dialog_base.py

ketika Anda pertama kali membuat plugin Anda dan setiap kali Anda mengedit dialog plugin Anda dengan QtDesigner. Ini adalah metode plugin yang lama.

Apakah akan mengedit .uifile atau menjalankan pyuic4setiap kali adalah pilihan Anda.

Layak Lutz
sumber
MaryBeth, elemen `sumber daya harus berupa elemen kosong, bukan tag penutup dari elemen itu.
mariotomo
9

Anda dapat menghindari keharusan mengedit file .ui atau mengkompilasi, dll dengan melakukan hal berikut:

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 default ke '_rc' itulah sebabnya ia selalu mencari 'resources_rc.' (Anda selalu dapat membiarkannya di default jika Anda benar-benar ingin menggunakan resources_rc, tentu saja)

Dan menambahkan path file .ui ke sys.path memungkinkan python untuk menemukan resources.py. Anda akan berpikir itu akan bisa mengetahuinya karena direktori Anda saat ini seharusnya di sys.path (dan impor lainnya dari pekerjaan direktori Anda saat ini), tetapi tidak. Saya belum cukup memeriksanya untuk mencari tahu mengapa.

Jason Hight
sumber
8

Saya akhirnya memperbaikinya setelah 3 jam mencoba. Seperti kata seseorang, QT Designer menambahkan

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

ke file UI Anda. Saya cukup menghapus baris-baris itu dan semuanya berfungsi dengan baik (sumber daya terlihat di GUI)

Mahasiswa Michal Wloga
sumber
Ini masih menjadi masalah dengan QGIS 2.14, jadi jawaban ini dan Layak Lutz banyak membantu!
Andreas Müller
2

Saya pikir jawaban singkat untuk masalah ini adalah orang-orang memuat proyek secara langsung ke QGIS alih-alih berjalan:

make deploy

File resources.pyhanya dihasilkan setelah pertama kali make deploydijalankan.

tobias47n9e
sumber
2

Inilah cara saya memperbaiki masalah:

  • Run-> cmd

  • Buka lokasi pembuat plugin Anda (mis .: c: /users/rafik_pc/.qgis2/python/plugins/pluginbuilder)

  • ketik perintah berikut:

    pyrcc4 -py2 resources.qrc -o resources.py

(Saya menggunakan -py2 karena saya menggunakan python 2.7)

  • restart QGIS Anda.

  • DIBUAT

Chinwi85
sumber
0

Apa yang berhasil bagi saya pada akhirnya adalah menggunakan sumber daya asli yang datang ketika saya membuat paket dengan pembuat plugin dan menggunakannya dalam semua dialog lain dari plugin saya. Saya masih tidak tahu mengapa ikon utama plugin saya berubah ketika memuat ulang plugin, tetapi saya masih mendapatkan grafik di dialog lain.

Saya berharap ini akan berbeda karena berbagai alasan. Untuk membangun plugin sederhana pendekatan ini mungkin berhasil. Ini masalah organisasi.

Karena saya mempunyai begitu banyak masalah dengan sumber daya ini, saya telah membangun resources.py dan resources_rc.py itu sebabnya saya mendapatkan masalah saat memuat ulang.

Saya tidak punya waktu untuk mengatasi masalah ini, tetapi tim dev QGIS harus menaruh perhatian padanya karena hal itu menghalangi orang untuk membuat plugin yang indah: D

Apa yang akhirnya saya lakukan adalah memiliki sederhana:

import resources

sebelum memanggil kelas UI.

Terima kasih telah membantu saya dengan kekacauan ini.

PS: Anda harus "kompilasi" sumber daya Anda sebelum menambahkannya ke file * .ui Anda dan gunakan gunakan sumber daya yang sama -> impor sumber daya di semua dialog plugin Anda. Saya harap ini membantu seseorang.

Greg
sumber
0

Jalankan perintah yang sama menggunakan

sudo pyrcc4 -o resources_rc.py resources.qrc

Itu akan berhasil

osmjit
sumber