8 сентября 2011 г.

Использование компилятора ресурсов pyrcc4 в PyQt

При использовании замечательной питоновской библиотеки PyQT для компиляции ресурсов (например файлов изображений) в код модуля применяется утилита, поставляемая вместе с библиотекой. Находится она в папке bin (а иногда в корне библиотеки) и называется pyrcc4.

В нашем случае давайте скомпилируем в ресурс файл изображения Qt-logo.png. Для этого выполним несколько несложных действий.

Создадим файл например res.qrc формата XML, описывающий ресурсы

<!DOCTYPE RCC><RCC version="1.0">
<qresource>
    <file>Qt-logo.png</file>
</qresource>
</RCC>

Затем, нашей утилитой pyrcc4.exe (для Windows) сгенерим питоновский скрипт, содержащий наше изображение, например так:

pyrcc4 -o путь_до_файла\rc.py -py2 путь_до_файла\res.qrc

Осталось лишь экспортировать код в виде модуля и использовать в наших скриптах, например как показано ниже.

from PyQt4 import QtCore, QtGui
import sys
import rc

app = QtGui.QApplication(sys.argv)

window = QtGui.QWidget()
window.setWindowTitle("Simple app with resource")
window.resize(150, 100)

image = QtGui.QPixmap(":/Qt-logo.png")
label = QtGui.QLabel()
label.setAlignment(QtCore.Qt.AlignCenter)
label.setPixmap(image)
button = QtGui.QPushButton("&Close")

vbox = QtGui.QVBoxLayout()
vbox.addWidget(label)
vbox.addWidget(button)

window.setLayout(vbox)

QtCore.QObject.connect(
    button,
    QtCore.SIGNAL("clicked()"),
    QtGui.qApp,
    QtCore.SLOT("quit()")
)

window.show()
sys.exit(app.exec_())

Следует отметить, что размер файла ресурса значительно больше размера исходного изображения. Для уменьшения объема можно использовать компрессию.

7 комментариев:

Анонимный комментирует...

Спасибо Вам! большое! Сколько не искал, ну никто, не удосужился написать примеры. Просто брали и тыкали в документацию в которой тоже ничего подобного не нашел. А тут бац, все просто, в одном месте, ничего лишнего.
.txt to .bat и готово.

Ivan Sergeev комментирует...

Рад помочь

Анонимный комментирует...

Черта с два так заработает!
В приведенном выше коде из rc ничего не подцепляется и label.Pixmap - будет прозрачным.

Ivan Sergeev комментирует...

Сейчас перепроверил. У меня всё прекрасно работает. Давайте попробуем посмотреть на окружение: должно быть Windows, PyQt4 (хотя, думаю, и на других ОС и Qt5 тоже будет работать). Файл изображения должен называться одинаково во всех файлах (main.py, res.qrc) и попробуйте его для начала расположить там же, где исполняемый модуль.

Ivan Sergeev комментирует...

К окружению: Python 2

Алексей Ярков комментирует...

Подскажите, а кроме картинок что можно упаковать? Можно текстовый файл, а потом читать его оттуда?

Ivan Sergeev комментирует...

Любые файлы можно упаковывать.

Отправить комментарий