#python #user-interface #tkinter
Вопрос:
Я пытаюсь добавить значок программы, который я получил в виде изображения bmp, в ScrolledText
виджет. Я получаю эту ошибку:
_кинтер_.Ошибка TclError: изображение «<PIL.BmpImagePlugin.BmpImageFile режим изображения=Размер RGB=32×32 при 0x19B2FA18EB0>» не существует
Вот соответствующий код:
def get_icon(exe):
ico_x = win32api.GetSystemMetrics(win32con.SM_CXICON)
ico_y = win32api.GetSystemMetrics(win32con.SM_CYICON)
large, small = win32gui.ExtractIconEx(exe, 0)
win32gui.DestroyIcon(small[0])
hdc = win32ui.CreateDCFromHandle(win32gui.GetDC(0))
hbmp = win32ui.CreateBitmap()
hbmp.CreateCompatibleBitmap(hdc, ico_x, ico_y)
hdc = hdc.CreateCompatibleDC()
hdc.SelectObject(hbmp)
hdc.DrawIcon((0, 0), large[0])
hbmp.SaveBitmapFile(hdc, 'icon.bmp')
img = Image.open("icon.bmp")
return img
text_area = ScrolledText(root,
width = 40,
height = 40,
font = ("Times New Roman",
25))
img = get_icon("C:Program FilesBraveSoftwareBrave-BrowserApplicationBrave.exe")
text_area.image_create("current", padx=5, pady=5, image=ImageTk.PhotoImage(img))
text_area.place(relx=0.2, rely=0.1, relwidth=0.5, relheight=0.5, anchor='s')
Есть какие-нибудь идеи?
Комментарии:
1. Если у вас есть несколько экземпляров
tk.Tk()
, попробуйте добавитьmaster=text_area
вImageTk.PhotoImage(img)
2. @TheLizzard У меня есть только один экземпляр, и он корневой.
3. Вы должны сохранить ссылку на
PhotoImage
объект, чтобы он продолжал существовать — например, в качестве глобальной переменной.4. Спасибо @jasonharper, я сделал это, и теперь это не дает никаких ошибок. К сожалению, изображение не появляется.
5. Попробуйте использовать ссылку и другие координаты для места(например
relx=0.5, rely=0.5
), илиpack()
.