Уведомления

Группа в Telegram: присоединиться

#1 Фев. 14, 2019 10:52:39

nick789
Зарегистрирован: 2016-09-21
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

А можно как то иконку в тело кода засунуть

 imgToolBarOpen = ImageTk.PhotoImage(file="open_25.png")
butToolBarOpen = Button(myToolBar, image=imgToolBarOpen,  command=onClick_ButOpen_ToolBar)
butToolBarOpen.pack()

В коде, для украшения всяких кнопочек, использую иконки. Их много. Они лежат отдельными файликами.
Хочется навести красоту, все свести в один файлик. Например в
superprog.py
Один файлик удобней на флешке носить, чем папку с кучей файликов.
Это как то Возможно ?

Офлайн

#2 Фев. 14, 2019 10:59:53

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 1198
Репутация: +  187  -
Профиль   Отправить e-mail  

А можно как то иконку в тело кода засунуть

nick789
Это как то Возможно ?
можно превратить картинку в набор байтов или даже строку, а потом соотвевенно обратно.
 import base64
with open("test.png", "rb") as imageFile:
    str = base64.b64encode(imageFile.read())
    print (str)
fh = open("test2.png", "wb")
fh.write(base64.b64decode(str))
fh.close()

Отредактировано PEHDOM (Фев. 14, 2019 11:05:45)

Онлайн

#3 Фев. 14, 2019 11:42:56

nick789
Зарегистрирован: 2016-09-21
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

А можно как то иконку в тело кода засунуть

 str=b'iVBORw0KGgoAAAA ... ElFTkSuQmCC'
butToolBarOpen = Button(myToolBar, image=str,  command=onClick_ButOpen_ToolBar)

Как то так ?? Выдает страшную ошибку.

 imgToolBarOpen = ImageTk.PhotoImage(data=str)
>>> Исключение "unhandled OSError"
cannot identify image file <_io.BytesIO object at 0x7f00f1d1f620>
Файл: /usr/lib64/python3/site-packages/PIL/Image.py, строка: 2687

То же на завелось.

https://www.oreilly.com/library/view/python-cookbook/0596001673/ch09s06.html
Это работает только для gif ?

 with open("open_25.png", "rb") as imageFile:
    str = base64.b64encode(imageFile.read())
imgToolBarOpen = ImageTk.PhotoImage(data=str)
Может переменную не так заполняю.
Так тоже не завелось, хотя должно:

https://stackoverflow.com/questions/42174987/how-do-i-use-the-base64-encoded-image-string-in-tkinter-label
http://qaru.site/questions/13222829/how-do-i-use-the-base64-encoded-image-string-in-tkinter-label

Отредактировано nick789 (Фев. 14, 2019 12:49:13)

Офлайн

#4 Фев. 14, 2019 12:58:10

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 90
Репутация: +  12  -
Профиль   Отправить e-mail  

А можно как то иконку в тело кода засунуть

nick789, у Вас чуть-чуть есть недопонимание совета от PEHDOM. Он предлагает конвертировать изображение в строку для хранения в файле. Перед использованием - надо провести обратную конвертацию через base64.b64decode(str) и только после этого вставлять в код.
То есть, вместо butToolBarOpen = Button(myToolBar, image=str, command=onClick_ButOpen_ToolBar) надо сделать как-то так: butToolBarOpen = Button(myToolBar, image=base64.b64decode(str), command=onClick_ButOpen_ToolBar).
Для хранения в одном файле множества картинок необходимо предусмотреть какой-либо разделитель типа осмысленного слова “моякартинка” или чего-либо другого. После прочтения всего содержимого из файла: поделить строку по этому разделителю через split и конвертировать требуемый элемент списка в нужном месте кода.

Офлайн

#5 Фев. 14, 2019 13:23:57

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 1198
Репутация: +  187  -
Профиль   Отправить e-mail  

А можно как то иконку в тело кода засунуть

nick789
imgToolBarOpen = ImageTk.PhotoImage(data=str)
ну нельзя же так буквально ему строку скармливать,
 from tkinter import *
from PIL import ImageTk, Image
from io import BytesIO
import base64
pic = b'iVBOR......'
root = Tk()
img_tk = ImageTk.PhotoImage(Image.open(BytesIO(base64.b64decode(pic))))
butToolBarOpen = Button(root, image=img_tk)
butToolBarOpen.pack()
root.mainloop()
Rafik
Для хранения в одном файле множества картинок необходимо предусмотреть какой-либо разделитель типа осмысленного слова “моякартинка” или чего-либо другого. После прочтения всего содержимого из файла: поделить строку по этому разделителю через split и конвертировать требуемый элемент списка в нужном месте кода.
Я бы вообще делал проще, создаем файл например icons.py в нем переменные типа
 main_icon =  b'iVBOR......'
open_icon = b'iVBOR......'
...
и т.д.
и потом уже в основном коде както так:
 import icons
...
open_icon = ImageTk.PhotoImage(Image.open(BytesIO(base64.b64decode(icons.open_icon))))
butToolBarOpen = Button(root, image=open_icon,.....)
 
нет конечно можно хранить и просто в файле через разделитель, но что тогда мешает сразу записать в один файл в бинарном виде все картинки, через тот же разделитель?


Отредактировано PEHDOM (Фев. 14, 2019 13:27:08)

Онлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version