Куда засунуть картинку в программе на Wxpython (Куда засунуть картинку?)

Модератор: Модераторы разделов

Аватара пользователя
ddc
Бывший модератор
Сообщения: 3535
Статус: OpenBSD-compatible
ОС: OpenBSD -current

Куда засунуть картинку в программе на Wxpython

Сообщение ddc »

Есть программа, ей нужна картинка. Никак не пойму, куда картинку эту запихнуть и откуда её читать в программе.
Идеальным был бы вариант хравнить картинку в модуле, но я не знаю, как её запихнуть в файл модуля, и как оттуда потом прочитать.
Если не запихивать, то куда девать, и как потом её находить в системе?

Буду рад за соображения.
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Куда засунуть картинку в программе на Wxpython

Сообщение Liksys »

Сохрани картинку в формат XPM. О сохраняет что-то вроде заголовочника С с определенным массивом. Этот массив можно перегнать в питоновый список. Для простоты можно сделать форму в QtDesigner (Qt-3.x.x, в дизайнер Qt4 еще не вставили эту фичу), поставить лабел и в него картинку XPM. Потом сохранить форму и сделать с ней pyuic form.ui -o form.py. Там и будет в коде твоя картинка. Копипасти ее в какой-нить модуль.
А вот с чтением не знаю как быть. В Qt(3/4) есть встроенные средства чтнения таких извратов, по идее что-то в этом духе должно быть и в wx.

Если не запихивать, то можно в систему при установке делать каталог, например /usr/lib/myprog. Там создать два каталога - например pictures и py. В программе можно сделать что-то в духе:

Код: Выделить всё

def getPicture(name) :
   return "/usr/lib/myprog/pictures" + name


А модули из заданного каталога (не из текущего, а вообще) импортировать так:

Код: Выделить всё

import sys
sys.path.append("/usr/lib/myprog/py")
import MyModule
где MyModule - /usr/lib/myprog/py/MyModule.py. Эти строки добавили еще один путь для поиска модулей.
Спасибо сказали:
Аватара пользователя
ddc
Бывший модератор
Сообщения: 3535
Статус: OpenBSD-compatible
ОС: OpenBSD -current

Re: Куда засунуть картинку в программе на Wxpython

Сообщение ddc »

Ну да, я так и сделал... Но просто очень хотелось:
  • всунуть картинку в файл (Qt Desiger'а у меня нет, сейчас поставлю);
  • не привязывать проект к строке (т.е. у меня он буедт в "/usr/lib/myprog", а в *BSD - в "/usr/local/lib/myprog")...
Кроме того, программа предполагается к использованию под разными ОС, а под Winows путь оказывается совсем другим...
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Куда засунуть картинку в программе на Wxpython

Сообщение Liksys »

А в wx есть возможность из списка картинку читать?
Спасибо сказали:
Аватара пользователя
ddc
Бывший модератор
Сообщения: 3535
Статус: OpenBSD-compatible
ОС: OpenBSD -current

Re: Куда засунуть картинку в программе на Wxpython

Сообщение ddc »

Там есть функция "wx.BitmapFromXPMData", кроме неё только из файла или из потока.
Спасибо сказали:
Аватара пользователя
ddc
Бывший модератор
Сообщения: 3535
Статус: OpenBSD-compatible
ОС: OpenBSD -current

Re: Куда засунуть картинку в программе на Wxpython

Сообщение ddc »

Код: Выделить всё

wx.BitmapFromXPMData("""текст
файла
XPM
""")
Сигфолтит... Что я делаю не так?
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Куда засунуть картинку в программе на Wxpython

Сообщение Liksys »

А почему """..."""?
Я говорю, надо не содержимое файла, а уже сконверченный файл. Я выше написал, как получить список Python из массива C (через designer). Этот список (или список списков, не помню уже) в отдельную переменную и на съедение функции.
Спасибо сказали:
Аватара пользователя
ddc
Бывший модератор
Сообщения: 3535
Статус: OpenBSD-compatible
ОС: OpenBSD -current

Re: Куда засунуть картинку в программе на Wxpython

Сообщение ddc »

"""...""" чтобы не эскейпить. С Qt Designer'ом разминулся - в Portage не нашёл.
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Куда засунуть картинку в программе на Wxpython

Сообщение Liksys »

Он в комплекте с Qt. Попробуй команду designer. Но для pyuic тебе надо доустановить PyQt3
Спасибо сказали:
Аватара пользователя
eduard_pustobaev
Сообщения: 2629
Статус: Ленивец
ОС: Arch/Debian.

Re: Куда засунуть картинку в программе на Wxpython

Сообщение eduard_pustobaev »

ddc писал(а):
02.05.2007 15:17
Ну да, я так и сделал... Но просто очень хотелось:
  • всунуть картинку в файл (Qt Desiger'а у меня нет, сейчас поставлю);
  • не привязывать проект к строке (т.е. у меня он буедт в "/usr/lib/myprog", а в *BSD - в "/usr/local/lib/myprog")...
Кроме того, программа предполагается к использованию под разными ОС, а под Winows путь оказывается совсем другим...

1) Не знаю насчёт wx. Но в qt можно отображать много форматов на QLabel или QPainter'ом или...:

Код: Выделить всё

[b]Format           Qt's support[/b]

BMP               Read/write
GIF                Read
JPG                Read/write
JPEG              Read/write
PNG               Read/write
PBM               Read
PGM               Read
PPM               Read/write
XBM               Read/write
XPM               Read/write


2) Ну тут уж как-то define'ми или что там в пайтоне для этого. Или относительные пути использовать:
<!DOCTYPE RCC><RCC version="1.0">
<qresource>
<file>images/myimage.png</file>
</qresource>
</RCC>
Это если на qt c её системой ресурсов.
Правда тогда придётся засирать директорию с бинарником каталогом "images". В винде-то это как раз то, что нужно. А вот в /usr/bin к примеру такую директорию создавать как-то странно.

P.S. Мог чего не догнать в самом вопросе. Бо начали с wxwidgets для пайтона, а потом про qt для пайтона. А я про qt для C++, мож у пайтоновского биндинга и есть какие особенности...
В дисгармонии со вселенной.
Спасибо сказали:
Аватара пользователя
ddc
Бывший модератор
Сообщения: 3535
Статус: OpenBSD-compatible
ОС: OpenBSD -current

Re: Куда засунуть картинку в программе на Wxpython

Сообщение ddc »

eduard_pustobaev
Нет, картинка из файла картинки вставляется замечательно. Проблема в том, что хочется вложить картинку в файл скрипта.
Т.е. под Windows сейчас всё замечательно, просто под Linux приходится извращаться. А хочется универсальности.
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Куда засунуть картинку в программе на Wxpython

Сообщение Liksys »

ddc писал(а):
02.05.2007 18:05
под Windows сейчас всё замечательно
А как там сделано?
Спасибо сказали:
Аватара пользователя
ddc
Бывший модератор
Сообщения: 3535
Статус: OpenBSD-compatible
ОС: OpenBSD -current

Re: Куда засунуть картинку в программе на Wxpython

Сообщение ddc »

Очень просто - вся программа в одной папке. :)
На рабочем компьютере Python прописан в $PATH, на другие рабочие компьютеры ставлю с помощью py2exe.
Дома использую старую версию, в которой не было картинок (два скрипта, один в $PYTHONPATH, другой - в /usr/local/bin).
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Куда засунуть картинку в программе на Wxpython

Сообщение Liksys »

Имхо, самый правильный вариант - все паши, которые могут изменяться - вынести в отдельный файл, например ConstLinux.py и ConstWindows.py. А потом в зависимости от системы (была по-моему какаято константа, которая показывает ось или просто руками импортировать). Изменил одну строчку - и работает. И там же, если программа активно работает с путями к файлам сделать переменную для Linux - Sharp="/" и для вендоф соотсно наоборот в соответствующем файле. Потом написать два скрипта-инсталлятора - один на sh а второй bat.

Мне заказывали программу-эмулятор лабораторного оборудования, я написал ее именно таким образом. Все работало на ура.
Спасибо сказали:
Аватара пользователя
eduard_pustobaev
Сообщения: 2629
Статус: Ленивец
ОС: Arch/Debian.

Re: Куда засунуть картинку в программе на Wxpython

Сообщение eduard_pustobaev »

ddc писал(а):
02.05.2007 18:05
eduard_pustobaev
Нет, картинка из файла картинки вставляется замечательно. Проблема в том, что хочется вложить картинку в файл скрипта.
Т.е. под Windows сейчас всё замечательно, просто под Linux приходится извращаться. А хочется универсальности.

Ясно можно хранить как текст в QString(я всё ещё про qt и С++). Потом:

Код: Выделить всё

QString data = "/dfslkhfkjGDFG...";
QByteArray bin = QByteArray::fromBase64(data.toLatin1());
QImage img();
img.fromData(&bin, "PNG")


типа того.
В дисгармонии со вселенной.
Спасибо сказали:
Аватара пользователя
ddc
Бывший модератор
Сообщения: 3535
Статус: OpenBSD-compatible
ОС: OpenBSD -current

Re: Куда засунуть картинку в программе на Wxpython

Сообщение ddc »

1. Систему показывает os.name.
2. Менять "/" на "\" в Windows не надо, python в Windows глотает "/" на ура.
3. Инстоллятор для Windows мне не нужен. Собственно вариант дописывания пути в установочном скрипте я рассматривал, но как-то это кривовато... А если учитывать, что изображение - иконка в трей и заголовок программы, делать ради неё отдельный скрипт совсем дико выглядит. ;)

eduard_pustobaev писал(а):
02.05.2007 18:53
Ясно можно хранить как текст в QString(я всё ещё про qt и С++). Потом:

Код: Выделить всё

QString data = "/dfslkhfkjGDFG...";
QByteArray bin = QByteArray::fromBase64(data.toLatin1());
QImage img();
img.fromData(&bin, "PNG")
типа того.
Можно. Но я пишу на wxPython. ;)
Собственно, я бы вполне мог хранить и в потоке cStringIO, только не понимаю, что за формат "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00 \...".
Спасибо сказали:
Аватара пользователя
eduard_pustobaev
Сообщения: 2629
Статус: Ленивец
ОС: Arch/Debian.

Re: Куда засунуть картинку в программе на Wxpython

Сообщение eduard_pustobaev »

ddc писал(а):
02.05.2007 19:00
Собственно, я бы вполне мог хранить и в потоке cStringIO, только не понимаю, что за формат "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00 \...".

Может png? :)
В дисгармонии со вселенной.
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Куда засунуть картинку в программе на Wxpython

Сообщение Liksys »

Ну тогда сделай вариант с массивом! Сохраняешь картинко как xpm, открываешь designer, создаешь форму с лейблом, на лейбл ставишь картинко. Закрываешь, и конвертишь ui в py, как я постами выше написал. У тебя будет список. Этот список копируешь в модуль и делаешь на него wx.BitmapFromXPMData
Спасибо сказали:
Аватара пользователя
ddc
Бывший модератор
Сообщения: 3535
Статус: OpenBSD-compatible
ОС: OpenBSD -current

Re: Куда засунуть картинку в программе на Wxpython

Сообщение ddc »

Всем спасибо, справился. ;)
Через консоль python импортировал файл, записал в StringIO. Содержимое StringIO вывел в ту же консоль, откуда скопипейстил в программу, после чего вопрос был решён следующей конструкцией:

Код: Выделить всё

stream = cStringIO.StringIO('<рисунок>')
icon = wx.IconFromBitmap(wx.BitmapFromImage(wx.ImageFromStream(stream)))


Ещё раз всем большое спасибо! Если бы не ваши советы и участие, не допёр бы в заданный период времени! ;)

eduard_pustobaev писал(а):
02.05.2007 19:10
Может png? :)
Не, это я понял, я не понял, как приводить PNG к такому виду. Ну не доходило, что это просто unicode-эскейпы...
Спасибо сказали:
Аватара пользователя
Liksys
Сообщения: 2910

Re: Куда засунуть картинку в программе на Wxpython

Сообщение Liksys »

Всегда пожалуйста ;)
Спасибо сказали: