Найти - Пользователи
Полная версия: А можно как то иконку в тело кода засунуть
Начало » Python для новичков » А можно как то иконку в тело кода засунуть
1
nick789
 imgToolBarOpen = ImageTk.PhotoImage(file="open_25.png")
butToolBarOpen = Button(myToolBar, image=imgToolBarOpen,  command=onClick_ButOpen_ToolBar)
butToolBarOpen.pack()

В коде, для украшения всяких кнопочек, использую иконки. Их много. Они лежат отдельными файликами.
Хочется навести красоту, все свести в один файлик. Например в
superprog.py
Один файлик удобней на флешке носить, чем папку с кучей файликов.
Это как то Возможно ?
PEHDOM
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()
nick789
 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
Rafik
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 и конвертировать требуемый элемент списка в нужном месте кода.
PEHDOM
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,.....)
 
нет конечно можно хранить и просто в файле через разделитель, но что тогда мешает сразу записать в один файл в бинарном виде все картинки, через тот же разделитель?


This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB