Куда засунуть картинку в программе на Wxpython (Куда засунуть картинку?)
Модератор: Модераторы разделов
-
ddc
- Бывший модератор
- Сообщения: 3535
- Статус: OpenBSD-compatible
- ОС: OpenBSD -current
Куда засунуть картинку в программе на Wxpython
Есть программа, ей нужна картинка. Никак не пойму, куда картинку эту запихнуть и откуда её читать в программе.
Идеальным был бы вариант хравнить картинку в модуле, но я не знаю, как её запихнуть в файл модуля, и как оттуда потом прочитать.
Если не запихивать, то куда девать, и как потом её находить в системе?
Буду рад за соображения.
Идеальным был бы вариант хравнить картинку в модуле, но я не знаю, как её запихнуть в файл модуля, и как оттуда потом прочитать.
Если не запихивать, то куда девать, и как потом её находить в системе?
Буду рад за соображения.
-
Liksys
- Сообщения: 2910
Re: Куда засунуть картинку в программе на Wxpython
Сохрани картинку в формат XPM. О сохраняет что-то вроде заголовочника С с определенным массивом. Этот массив можно перегнать в питоновый список. Для простоты можно сделать форму в QtDesigner (Qt-3.x.x, в дизайнер Qt4 еще не вставили эту фичу), поставить лабел и в него картинку XPM. Потом сохранить форму и сделать с ней pyuic form.ui -o form.py. Там и будет в коде твоя картинка. Копипасти ее в какой-нить модуль.
А вот с чтением не знаю как быть. В Qt(3/4) есть встроенные средства чтнения таких извратов, по идее что-то в этом духе должно быть и в wx.
Если не запихивать, то можно в систему при установке делать каталог, например /usr/lib/myprog. Там создать два каталога - например pictures и py. В программе можно сделать что-то в духе:
А модули из заданного каталога (не из текущего, а вообще) импортировать так:
где MyModule - /usr/lib/myprog/py/MyModule.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-
ddc
- Бывший модератор
- Сообщения: 3535
- Статус: OpenBSD-compatible
- ОС: OpenBSD -current
Re: Куда засунуть картинку в программе на Wxpython
Ну да, я так и сделал... Но просто очень хотелось:
- всунуть картинку в файл (Qt Desiger'а у меня нет, сейчас поставлю);
- не привязывать проект к строке (т.е. у меня он буедт в "/usr/lib/myprog", а в *BSD - в "/usr/local/lib/myprog")...
-
Liksys
- Сообщения: 2910
Re: Куда засунуть картинку в программе на Wxpython
А в wx есть возможность из списка картинку читать?
-
ddc
- Бывший модератор
- Сообщения: 3535
- Статус: OpenBSD-compatible
- ОС: OpenBSD -current
Re: Куда засунуть картинку в программе на Wxpython
Там есть функция "wx.BitmapFromXPMData", кроме неё только из файла или из потока.
-
ddc
- Бывший модератор
- Сообщения: 3535
- Статус: OpenBSD-compatible
- ОС: OpenBSD -current
Re: Куда засунуть картинку в программе на Wxpython
Код: Выделить всё
wx.BitmapFromXPMData("""текст
файла
XPM
""")-
Liksys
- Сообщения: 2910
Re: Куда засунуть картинку в программе на Wxpython
А почему """..."""?
Я говорю, надо не содержимое файла, а уже сконверченный файл. Я выше написал, как получить список Python из массива C (через designer). Этот список (или список списков, не помню уже) в отдельную переменную и на съедение функции.
Я говорю, надо не содержимое файла, а уже сконверченный файл. Я выше написал, как получить список Python из массива C (через designer). Этот список (или список списков, не помню уже) в отдельную переменную и на съедение функции.
-
ddc
- Бывший модератор
- Сообщения: 3535
- Статус: OpenBSD-compatible
- ОС: OpenBSD -current
Re: Куда засунуть картинку в программе на Wxpython
"""...""" чтобы не эскейпить. С Qt Designer'ом разминулся - в Portage не нашёл.
-
Liksys
- Сообщения: 2910
Re: Куда засунуть картинку в программе на Wxpython
Он в комплекте с Qt. Попробуй команду designer. Но для pyuic тебе надо доустановить PyQt3
-
eduard_pustobaev
- Сообщения: 2629
- Статус: Ленивец
- ОС: Arch/Debian.
Re: Куда засунуть картинку в программе на Wxpython
ddc писал(а): ↑02.05.2007 15:17Ну да, я так и сделал... Но просто очень хотелось:Кроме того, программа предполагается к использованию под разными ОС, а под Winows путь оказывается совсем другим...
- всунуть картинку в файл (Qt Desiger'а у меня нет, сейчас поставлю);
- не привязывать проект к строке (т.е. у меня он буедт в "/usr/lib/myprog", а в *BSD - в "/usr/local/lib/myprog")...
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/write2) Ну тут уж как-то 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
eduard_pustobaev
Нет, картинка из файла картинки вставляется замечательно. Проблема в том, что хочется вложить картинку в файл скрипта.
Т.е. под Windows сейчас всё замечательно, просто под Linux приходится извращаться. А хочется универсальности.
Нет, картинка из файла картинки вставляется замечательно. Проблема в том, что хочется вложить картинку в файл скрипта.
Т.е. под Windows сейчас всё замечательно, просто под Linux приходится извращаться. А хочется универсальности.
-
Liksys
- Сообщения: 2910
-
ddc
- Бывший модератор
- Сообщения: 3535
- Статус: OpenBSD-compatible
- ОС: OpenBSD -current
Re: Куда засунуть картинку в программе на Wxpython
Очень просто - вся программа в одной папке. 
На рабочем компьютере Python прописан в $PATH, на другие рабочие компьютеры ставлю с помощью py2exe.
Дома использую старую версию, в которой не было картинок (два скрипта, один в $PYTHONPATH, другой - в /usr/local/bin).
На рабочем компьютере Python прописан в $PATH, на другие рабочие компьютеры ставлю с помощью py2exe.
Дома использую старую версию, в которой не было картинок (два скрипта, один в $PYTHONPATH, другой - в /usr/local/bin).
-
Liksys
- Сообщения: 2910
Re: Куда засунуть картинку в программе на Wxpython
Имхо, самый правильный вариант - все паши, которые могут изменяться - вынести в отдельный файл, например ConstLinux.py и ConstWindows.py. А потом в зависимости от системы (была по-моему какаято константа, которая показывает ось или просто руками импортировать). Изменил одну строчку - и работает. И там же, если программа активно работает с путями к файлам сделать переменную для Linux - Sharp="/" и для вендоф соотсно наоборот в соответствующем файле. Потом написать два скрипта-инсталлятора - один на sh а второй bat.
Мне заказывали программу-эмулятор лабораторного оборудования, я написал ее именно таким образом. Все работало на ура.
Мне заказывали программу-эмулятор лабораторного оборудования, я написал ее именно таким образом. Все работало на ура.
-
eduard_pustobaev
- Сообщения: 2629
- Статус: Ленивец
- ОС: Arch/Debian.
Re: Куда засунуть картинку в программе на Wxpython
Ясно можно хранить как текст в 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
1. Систему показывает os.name.
2. Менять "/" на "\" в Windows не надо, python в Windows глотает "/" на ура.
3. Инстоллятор для Windows мне не нужен. Собственно вариант дописывания пути в установочном скрипте я рассматривал, но как-то это кривовато... А если учитывать, что изображение - иконка в трей и заголовок программы, делать ради неё отдельный скрипт совсем дико выглядит.

Собственно, я бы вполне мог хранить и в потоке cStringIO, только не понимаю, что за формат "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00 \...".
2. Менять "/" на "\" в Windows не надо, python в Windows глотает "/" на ура.
3. Инстоллятор для Windows мне не нужен. Собственно вариант дописывания пути в установочном скрипте я рассматривал, но как-то это кривовато... А если учитывать, что изображение - иконка в трей и заголовок программы, делать ради неё отдельный скрипт совсем дико выглядит.
Можно. Но я пишу на wxPython.eduard_pustobaev писал(а): ↑02.05.2007 18:53Ясно можно хранить как текст в QString(я всё ещё про qt и С++). Потом:типа того.Код: Выделить всё
QString data = "/dfslkhfkjGDFG..."; QByteArray bin = QByteArray::fromBase64(data.toLatin1()); QImage img(); img.fromData(&bin, "PNG")
Собственно, я бы вполне мог хранить и в потоке cStringIO, только не понимаю, что за формат "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00 \...".
-
eduard_pustobaev
- Сообщения: 2629
- Статус: Ленивец
- ОС: Arch/Debian.
-
Liksys
- Сообщения: 2910
Re: Куда засунуть картинку в программе на Wxpython
Ну тогда сделай вариант с массивом! Сохраняешь картинко как xpm, открываешь designer, создаешь форму с лейблом, на лейбл ставишь картинко. Закрываешь, и конвертишь ui в py, как я постами выше написал. У тебя будет список. Этот список копируешь в модуль и делаешь на него wx.BitmapFromXPMData
-
ddc
- Бывший модератор
- Сообщения: 3535
- Статус: OpenBSD-compatible
- ОС: OpenBSD -current
Re: Куда засунуть картинку в программе на Wxpython
Всем спасибо, справился. 
Через консоль python импортировал файл, записал в StringIO. Содержимое StringIO вывел в ту же консоль, откуда скопипейстил в программу, после чего вопрос был решён следующей конструкцией:
Ещё раз всем большое спасибо! Если бы не ваши советы и участие, не допёр бы в заданный период времени!
Через консоль python импортировал файл, записал в StringIO. Содержимое StringIO вывел в ту же консоль, откуда скопипейстил в программу, после чего вопрос был решён следующей конструкцией:
Код: Выделить всё
stream = cStringIO.StringIO('<рисунок>')
icon = wx.IconFromBitmap(wx.BitmapFromImage(wx.ImageFromStream(stream)))Ещё раз всем большое спасибо! Если бы не ваши советы и участие, не допёр бы в заданный период времени!
Не, это я понял, я не понял, как приводить PNG к такому виду. Ну не доходило, что это просто unicode-эскейпы...
-
Liksys
- Сообщения: 2910
Re: Куда засунуть картинку в программе на Wxpython
Всегда пожалуйста 