Ошибка image "pyimage2" doesn't exist при использовании библиотеки Tkinter
Так и не могу решить проблему. Мне нужно запустить программу, чтобы на главном экране за место фона была фотография, а прямо на ней располагались кнопки. Предупредите меня, если мой вопрос не оригинален и оповестите меня о каких-то принципах гугла, о которых я мог не знать. Долгое время я разбираюсь с кодом, однако не могу понять, в чем причина. Столкнулся с данной ошибкой не первый раз, однако в ходе безуспешных попыток решить данную проблему вернулся снова к этой ошибке. Пробовал ответы со StackOverflow, но они не принесли мне пользы, поскольку я столкнулся с тем, что в прошлом виде моего кода применялся метод grid, а не pack. Пришлось разбираться с этим - и на данном моменте я решил все-таки написать на данный сайт, ожидая помощи от Вас. Благодарю за внимание!
Ошибка: image "pyimage2" doesn't exist
Код:
import tkinter as tk
from tkinter import *
from PIL import Image, ImageTk
def show_image(path):
root = tk.Tk()
root["bg"] = "black"
root.title("Torchery")#Название окна
root.wm_attributes("-alpha", 0.85)#регулировка прозрачности
root.geometry('600x500')
img = Image.open(path)
width = 500
ratio = (width / float(img.size[0]))
height = int((float(img.size[1]) * float(ratio)))
imag = img.resize((width, height), Image.ANTIALIAS)
image = ImageTk.PhotoImage(imag)
panel = tk.Label(root, image=image)
panel.pack(side="top", fill="both", expand="no")
tk.Button(root, text="Калькулятор", command=lambda: print("Привет, Tkinter!"))
tk.Button(text='Соцсеть', command=show_image(path).quit).place(x=260, y=250)
tk.Button(text='Настройки и параметры', command=show_image(path).quit).place(x=260, y=250)
lbl = Label(root.mainloop(), text='Выключение...')
lbl.grid(column=0, row=0)
root.mainloop()
show_image('C:/я слышал/что/путь/нужно/скрывать/Скачать-картинки-на-рабочий-стол-с-хорошим-качеством-красивые-крутые-6.jpg')
Ответы (3 шт):
Решение есть здесь https://stackoverflow.com/questions/12800007/why-photoimages-dont-exist
Оно странное, но интересное. Вместо Tk() нужно писать TopLevel(). Причина - указанная строка создает ещё один инстанс Tk, а это не очень нравится самой Tk.
Вообще для создания графического интерфейса лучше использовать PyQt5
Потому что вас поломают менеджеры размещения в tkinter
Я не знаю почему работает размещение изображения в tkinter.Label как в приведённом ниже скрипте, но так это работает
from io import BytesIO
from tkinter import Tk, Label, Button
from PIL import Image, ImageTk
import requests
URL = 'https://miro.medium.com/max/4000/0*-jWOgP1Dh0sF8Uxa.jpg'
class TkinterApplication(Tk):
def __init__(self):
super().__init__()
self.configure(bg='black')
self.title('Torchery')
self.wm_attributes("-alpha", 0.5)#регулировка прозрачности
self.geometry('705x500')
self.panel = Label(self)
self.panel.place(x=0, y=0)
Button(self, text="поменять фон", command=self.show_background_image).place(x=610, y=475)
def show_background_image(self):
content = requests.get(URL).content
pil_image = Image.open(BytesIO(content))
# pil_image.thumbnail((600, 500), Image.ANTIALIAS)
modified_image = pil_image.resize((700, 450), Image.ANTIALIAS)
image = ImageTk.PhotoImage(modified_image)
#######################################################################
self.panel.configure(image=image)
self.panel.image = image
#######################################################################
def main():
application = TkinterApplication()
application.mainloop()
if __name__ == '__main__':
main()
Я решил эту ошибку
Извлекая все функции из tkintera с помощью *, ты так же извлекаешь tkinter.Image, что конфликтует с from PIL import Image
Решается: from PIL import Image as I