Как поставить встроиную в программу иконку на заголовок окна программы на tkinter

У меня есть встроенная в программу иконка bitmapImg, так её можно встроить в кнопку:

import tkinter as tk

app = tk.Tk()

bitmapImgRaw = """#define bitmapimg_width 32
#define bitmapimg_height 32
static unsigned char bitmapimg_bits[] = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0xc0, 0xff, 0xff, 0x00,
   0x30, 0x00, 0xf0, 0x03, 0x30, 0x00, 0xf0, 0x03, 0x30, 0x00, 0xf0, 0x0f,
   0x30, 0x00, 0xf0, 0x0f, 0x30, 0xff, 0xf0, 0x0f, 0x30, 0xff, 0xf0, 0x0f,
   0x30, 0x00, 0x00, 0x0c, 0x30, 0x00, 0x00, 0x0c, 0x30, 0xff, 0x3f, 0x0c,
   0x30, 0xff, 0x3f, 0x0c, 0x30, 0x00, 0x00, 0x0c, 0x30, 0x00, 0x00, 0x0c,
   0x30, 0xff, 0x3f, 0x0c, 0x30, 0xff, 0x3f, 0x0c, 0x30, 0x00, 0x00, 0x0c,
   0x30, 0x00, 0x00, 0x0c, 0x30, 0xff, 0x3f, 0x0c, 0x30, 0xff, 0x3f, 0x0c,
   0x30, 0x00, 0x00, 0x0c, 0x30, 0x00, 0x00, 0x0c, 0xc0, 0xff, 0xff, 0x03,
   0xc0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };"""

bitmapImgGreen = tk.BitmapImage(data=bitmapImgRaw, foreground="green")
bitButton = tk.Button(master=app, image=bitmapImgGreen)
bitButton.pack()

app.mainloop()

Результат

Но как встроить вшиваемое изображение (bitmap или фото) в заголовок окна?


Ответы (2 шт):

Автор решения: S. Nick

Попробуйте так:

from PIL import Image                                                          # +++
from io import BytesIO                                                         # +++
import tkinter as tk

app = tk.Tk()

bitmapImgRaw = """#define bitmapimg_width 32
#define bitmapimg_height 32
static unsigned char bitmapimg_bits[] = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0xc0, 0xff, 0xff, 0x00,
   0x30, 0x00, 0xf0, 0x03, 0x30, 0x00, 0xf0, 0x03, 0x30, 0x00, 0xf0, 0x0f,
   0x30, 0x00, 0xf0, 0x0f, 0x30, 0xff, 0xf0, 0x0f, 0x30, 0xff, 0xf0, 0x0f,
   0x30, 0x00, 0x00, 0x0c, 0x30, 0x00, 0x00, 0x0c, 0x30, 0xff, 0x3f, 0x0c,
   0x30, 0xff, 0x3f, 0x0c, 0x30, 0x00, 0x00, 0x0c, 0x30, 0x00, 0x00, 0x0c,
   0x30, 0xff, 0x3f, 0x0c, 0x30, 0xff, 0x3f, 0x0c, 0x30, 0x00, 0x00, 0x0c,
   0x30, 0x00, 0x00, 0x0c, 0x30, 0xff, 0x3f, 0x0c, 0x30, 0xff, 0x3f, 0x0c,
   0x30, 0x00, 0x00, 0x0c, 0x30, 0x00, 0x00, 0x0c, 0xc0, 0xff, 0xff, 0x03,
   0xc0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };"""
   
bitmapImgGreen = tk.BitmapImage(data=bitmapImgRaw, foreground="green")   

bitButton = tk.Button(master=app, image=bitmapImgGreen)
bitButton.pack()

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
_xbm = bitmapImgRaw.encode() 
dimg = Image.open(BytesIO(_xbm))
dimg.save('myTest.png', format = 'PNG', sizes=[(32,32)])

app.tk.call('wm', 'iconphoto', app._w, tk.PhotoImage(file='myTest.png'))             # !!!

app.title('Bitmap_Img_Raw')  
app.geometry("300x200")
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

app.mainloop()

введите сюда описание изображения

→ Ссылка
Автор решения: Anty

Изображение можно вшить как gif закодированный в base64. Так оно будет выглядеть:

appImgB64 = """R0lGODlhIAAgAIABAAC7AP///yH+FWJ5IEFudHlFbG8sIHdpdGggR0lNUAAh+QQBCgABACwAAAAA
IAAgAAACf4wDqcutB5GbM0pLX0yQ7wxg4SWBoLGg5lmOngV/qvfGNq3hKan2rd/wAV2OzkhIMhmX
Bx1lliMaM1AcUtk8/j7U7FRbLXrHNexVmu2emWae21kZr1vx+TD41pbRuz1zCIVkA+MkOCiztcLS
p/iUBEYn9ucWhjdZ2VjzlbljUAAAOw=="""

Его можно превратить в PhotoImage, а уже его дать окну через .iconphoto(0, image):

import tkinter as tk
app = tk.Tk()
app.title("Волшебство 80lvl")
app.geometry("300x225") # 4:3
appImgB64 = """R0lGODlhIAAgAIABAAC7AP///yH+FWJ5IEFudHlFbG8sIHdpdGggR0lNUAAh+QQBCgABACwAAAAA
IAAgAAACf4wDqcutB5GbM0pLX0yQ7wxg4SWBoLGg5lmOngV/qvfGNq3hKan2rd/wAV2OzkhIMhmX
Bx1lliMaM1AcUtk8/j7U7FRbLXrHNexVmu2emWae21kZr1vx+TD41pbRuz1zCIVkA+MkOCiztcLS
p/iUBEYn9ucWhjdZ2VjzlbljUAAAOw=="""
    # gif в base64
appImgP = tk.PhotoImage(data=appImgB64)
app.iconphoto(0, appImgP)
app.mainloop()

Результат 2

→ Ссылка