Как вывести изображение из метода, в котором мы задаем название изображение Python Tkinter

Столкнулся с проблемой при создании проекта, в чем суть.

def ChangerCustom():
        selection = tree.selection()
        item = tree.item(selection)
        name = item["values"][0:3]
        for carName in name:
            carName = carName
            carLable = PhotoImage(file=fr"PhotoFolder\PhotoForDB\{carName}.png")
            CustomWindow(carLable)

В данном методе я из таблицы Tkinter беру выбранное мной значение, которое в свою очередь я вставляю в строку и передаю в другой метод

def CustomWindow(carName): #Создание виджитов редактора

    LabelMain = Canvas(bg="#A9A9A9", borderwidth=0, width=1980, height=1080)
    LabelMain.place(x=0, y=0)

    LabelMain.create_image(0, 0, image=carName)

В таком случае ошибок нет, но и изображение тоже не выводиться, можно конечно сказать что пути неправильные, но это не так.

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

Весь проект сделан без классов, собственно весь файл в котором происходит взаимодействие с пользователем

import FileReader
from DBConnect import *
from tkinter import *
from tkinter import Canvas
from tkinter import ttk

window = Tk()
window.iconbitmap(r'PhotoFolder\ico.ico')
window.title("Автосалон")

window.state('zoomed')

carLable = PhotoImage(file=r'PhotoFolder\LadaGranta.png')
markLable = PhotoImage(file=r'PhotoFolder\carMark.png')
logoLable = PhotoImage(file=r'PhotoFolder\ladaLogo.png')

def MainMenu(): # Создание главного окна
    LabelMain = Canvas(bg="#A9A9A9", borderwidth=0, width=1980, height=1080)
    LabelMain.place(x=0, y=0)

    LabelMain.create_image(300, 500, image=markLable)

    LabelMain.create_rectangle(0, 40, 600, 240, fill="#9A9A9A", outline="#696969")

    LabelMain.create_image(1600, 100, image=markLable)
    LabelMain.create_image(960, -420, image=markLable)

    LabelMain.create_image(900, 450, image=logoLable)
    LabelMain.create_image(1200, 600, image=carLable)

    LabelMain.create_text(1660, 970, text= "Автор работы:", font=("Bahnschrift Condensed", "20"))
    LabelMain.create_text(300, 120, text= "Автосалон", font=("Bahnschrift Condensed", "120"), fill="#505050")
    LabelMain.create_text(305, 125, text= "Автосалон",font=("Bahnschrift Condensed", "120"), fill="#F5F5F5")
    LabelMain.create_text(1210, 900, text= FileReader.FileReadMain, font=("Bahnschrift Condensed", "16"))

    def MenuStart():
        LabelMain.destroy()
        MenubuttonStart.destroy()
        MenubuttonInfo.destroy()
        MenubuttonEnd.destroy()
        SearchWindow()

    def CloseMenu():
        window.destroy()

    def InfoProgect(): # Окно информации
        windowinfo = Tk()
        windowinfo.iconbitmap(r'PhotoFolder\ico.ico')
        windowinfo.title("Информация")
        windowinfo.geometry('800x600')
        windowinfo.resizable(False, False)

        LabelMain = Canvas(windowinfo,bg="#A9A9A9", width=800, height=600)
        LabelMain.place(x=0, y=0)

        LabelMain.create_text(400, 100, text=FileReader.FileReadInfo,
                              font=("Bahnschrift Condensed", "20"))

        def CursorEnter(event):
            MenubuttonEnd["cursor"] = "hand2"
            MenubuttonEnd.bind("<Enter>", CursorEnter)

        def CloseMenu():
            windowinfo.destroy()

        MenubuttonEnd = Button(windowinfo, text="ВЫХОД", font=("Bahnschrift Condensed", "50"), width=8, command=CloseMenu, bg="#FFEFD5")
        MenubuttonEnd.place(x=280, y=410)

    MenubuttonStart = Button(text="      НАЧАТЬ", font=("Bahnschrift Condensed", "70"), width= 15, bg="#E4E4E4", command=MenuStart, borderwidth=0)
    MenubuttonStart.place(x=0, y=300)

    MenubuttonInfo = Button(text="О ПРОЕКТЕ", font=("Bahnschrift Condensed", "70"), width= 15, command=InfoProgect, bg="#E4E4E4", borderwidth=0)
    MenubuttonInfo.place(x=0, y=500)

    MenubuttonEnd = Button(text="ВЫХОД       ", font=("Bahnschrift Condensed", "70"),width= 15, command=CloseMenu, bg="#E4E4E4", borderwidth=0)
    MenubuttonEnd.place(x=0, y=700)

    def CursorEnter(event):
        MenubuttonStart["cursor"] = "hand2"
        MenubuttonInfo["cursor"] = "hand2"
        MenubuttonEnd["cursor"] = "hand2"

    MenubuttonStart.bind("<Enter>", CursorEnter)
    MenubuttonInfo.bind("<Enter>", CursorEnter)
    MenubuttonEnd.bind("<Enter>", CursorEnter)

def SearchWindow(): #Создание виджитов поиска

    LabelMain = Canvas(bg="#A9A9A9", borderwidth=0, width=1980, height=1080)
    LabelMain.place(x=0, y=0)

    LabelMain.create_image(300, 700, image=markLable)
    LabelMain.create_image(930, 600, image=markLable)
    LabelMain.create_image(1600, 400, image=markLable)



    def CallBaseFilter(): #Запрос к бд
        callDB = placeFind.get()
        filtrationWork = cursor.execute(f'''SELECT CarName FROM CarMark WHERE CarName LIKE ('%{callDB}%')''').fetchall()
        for car in filtrationWork:
            tree.insert("", END, values=car)

    FindButton = Button(text="Поиск", font=("Bahnschrift Condensed", "26"), bg="#A9A9A9", borderwidth=0, command=CallBaseFilter, width=8)
    FindButton.place(x=1470, y=31)



    def ChangerCustom(): # Выбор результата БД
        selection = tree.selection()
        item = tree.item(selection)
        name = item["values"][0:3]
        for carName in name:
            carName = carName
            carLable = PhotoImage(file=fr"PhotoFolder\PhotoForDB\{carName}.png")
            CustomWindow(carLable)

        LabelMain.destroy()
        SearchbuttonBack.destroy()

    EntButton = Button(text="Выбрать", font=("Bahnschrift Condensed", "25"), bg="#A9A9A9", borderwidth=0, command=ChangerCustom)
    EntButton.place(x=1470, y=151)

    columns = ("name", "tag")

    global tree
    tree = ttk.Treeview(columns=columns, show="headings", height=30) # Создание таблицы
    tree.place(x=350, y=150, width=900)

    tree.heading("name", text="Имя")
    tree.heading("tag", text="Тэг")

    global placeFind
    placeFind = ttk.Entry(width=50, font=("Bahnschrift Condensed", "40"))
    placeFind.place(x=350, y=30)

    def Changer():
        LabelMain.destroy()
        SearchbuttonBack.destroy()
        MainMenu()

    def CursorEnter(event):
        SearchbuttonBack["cursor"] = "hand2"

    LabelMain.create_rectangle(300, 0, 1600, 850, fill="#E6E6E6", outline="#696969")

    SearchbuttonBack = Button(text="<-- В главное меню   ", font=("Bahnschrift Condensed", "30"), width=25, bg="#FFEFD5", command=Changer)
    SearchbuttonBack.place(x=60, y=900)

    HangarbuttonEnter = Button(text="   В мой гараж -->", font=("Bahnschrift Condensed", "30"), width=25, bg="#FFEFD5")
    HangarbuttonEnter.place(x=1460, y=900)

    SearchbuttonBack.bind("<Enter>", CursorEnter)

def CustomWindow(carName): #Создание виджетов редактора

    LabelMain = Canvas(bg="#A9A9A9", borderwidth=0, width=1980, height=1080)
    LabelMain.place(x=0, y=0)

    LabelMain.create_image(0, 0, image=carName)

    def Changer():
        LabelMain.destroy()
        SearchbuttonBack.destroy()
        SearchWindow()

    SearchbuttonBack = Button(text="<-- В меню поиска  ", font=("Bahnschrift Condensed", "30"), width=25,
                              bg="#FFEFD5", command=Changer)
    SearchbuttonBack.place(x=60, y=900)

MainMenu()
window.mainloop()

Знаю, что здесь очень много недочетов, нахожусь в процессе обучения, буду очень рад помощи.

###########################

Нашел примерно то, что мне нужно, чуть позже надеюсь покажу: https://wiki.programstore.ru/python-rabota-s-izobrazheniyami-v-tkinter/


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

Автор решения: student2023

Все решилось благодаря гайду, вот он --> https://wiki.programstore.ru/python-rabota-s-izobrazheniyami-v-tkinter/

При нажатии на кнопку изображение не меняется. Хотя, казалось бы, все написано правильно, и наш обработчик событий работает, наше сообщение, что мы выводим командой print выводится в окно сообщений. В чем же дело? А дело в сборщике мусора (garbage collector). Как только мы вышли из my_event_handler, локальные переменные тут же уничтожаются сборщиком мусора. Именно поэтому мы видим на форме ту же самую картинку, что и до нажатия на кнопку. Как же быть? Не использовать локальные переменные. Давайте объявим класс, пусть изображение и прочие объекты хранятся в его полях:

import FileReader
from DBConnect import *
from tkinter import *
from tkinter import Canvas
from tkinter import ttk

class Frame:
    def __init__(self):
        self.window = Tk()
        self.window.iconbitmap(r'PhotoFolder\ico.ico')
        self.window.title("Автосалон")

        self.window.state('zoomed')

        carLable = PhotoImage(file=r'PhotoFolder\LadaGranta.png')
        markLable = PhotoImage(file=r'PhotoFolder\carMark.png')
        logoLable = PhotoImage(file=r'PhotoFolder\ladaLogo.png')

        def MainMenu(): # Создание главного окна
            LabelMain = Canvas(bg="#A9A9A9", borderwidth=0, width=1980, height=1080)
            LabelMain.place(x=0, y=0)

            LabelMain.create_image(300, 500, image=markLable)

            LabelMain.create_rectangle(0, 40, 600, 240, fill="#9A9A9A", outline="#696969")

            LabelMain.create_image(1600, 100, image=markLable)
            LabelMain.create_image(960, -420, image=markLable)

            LabelMain.create_image(900, 450, image=logoLable)
            LabelMain.create_image(1200, 600, image=carLable)

            LabelMain.create_text(1660, 970, text= "Автор работы: Воронин Илья, студент группы 3 ИП", font=("Bahnschrift Condensed", "20"))
            LabelMain.create_text(300, 120, text= "Автосалон", font=("Bahnschrift Condensed", "120"), fill="#505050")
            LabelMain.create_text(305, 125, text= "Автосалон",font=("Bahnschrift Condensed", "120"), fill="#F5F5F5")
            LabelMain.create_text(1210, 900, text= FileReader.FileReadMain, font=("Bahnschrift Condensed", "16"))

            def MenuStart():
                LabelMain.destroy()
                MenubuttonStart.destroy()
                MenubuttonInfo.destroy()
                MenubuttonEnd.destroy()
                SearchWindow()

            def CloseMenu():
                self.window.destroy()

            def InfoProgect(): # Окно информации
                windowinfo = Tk()
                windowinfo.iconbitmap(r'PhotoFolder\ico.ico')
                windowinfo.title("Информация")
                windowinfo.geometry('800x600')
                windowinfo.resizable(False, False)

                LabelMain = Canvas(windowinfo,bg="#A9A9A9", width=800, height=600)
                LabelMain.place(x=0, y=0)

                LabelMain.create_text(400, 100, text=FileReader.FileReadInfo,
                                      font=("Bahnschrift Condensed", "20"))

                def CursorEnter(event):
                    MenubuttonEnd["cursor"] = "hand2"
                    MenubuttonEnd.bind("<Enter>", CursorEnter)

                def CloseMenu():
                    windowinfo.destroy()

                MenubuttonEnd = Button(windowinfo, text="ВЫХОД", font=("Bahnschrift Condensed", "50"), width=8, command=CloseMenu, bg="#FFEFD5")
                MenubuttonEnd.place(x=280, y=410)

            MenubuttonStart = Button(text="      НАЧАТЬ", font=("Bahnschrift Condensed", "70"), width= 15, bg="#E4E4E4", command=MenuStart, borderwidth=0)
            MenubuttonStart.place(x=0, y=300)

            MenubuttonInfo = Button(text="О ПРОЕКТЕ", font=("Bahnschrift Condensed", "70"), width= 15, command=InfoProgect, bg="#E4E4E4", borderwidth=0)
            MenubuttonInfo.place(x=0, y=500)

            MenubuttonEnd = Button(text="ВЫХОД       ", font=("Bahnschrift Condensed", "70"),width= 15, command=CloseMenu, bg="#E4E4E4", borderwidth=0)
            MenubuttonEnd.place(x=0, y=700)

            def CursorEnter(event):
                MenubuttonStart["cursor"] = "hand2"
                MenubuttonInfo["cursor"] = "hand2"
                MenubuttonEnd["cursor"] = "hand2"

            MenubuttonStart.bind("<Enter>", CursorEnter)
            MenubuttonInfo.bind("<Enter>", CursorEnter)
            MenubuttonEnd.bind("<Enter>", CursorEnter)

        def SearchWindow(): #Создание виджитов поиска

            LabelMain = Canvas(bg="#A9A9A9", borderwidth=0, width=1980, height=1080)
            LabelMain.place(x=0, y=0)

            LabelMain.create_image(300, 700, image=markLable)
            LabelMain.create_image(930, 600, image=markLable)
            LabelMain.create_image(1600, 400, image=markLable)

            def CallBaseFilter():
                self.callDB = self.placeFind.get()
                self.filtrationWork = cursor.execute(f'''SELECT CarName FROM CarMark WHERE CarName LIKE ('%{self.callDB}%')''').fetchall()
                for car in self.filtrationWork:
                    self.tree.insert("", END, values=car)

            FindButton = Button(text="Поиск", font=("Bahnschrift Condensed", "26"), bg="#A9A9A9", borderwidth=0, command=CallBaseFilter, width=8)
            FindButton.place(x=1470, y=31)

            def ChangerCustom():
                self.selection = self.tree.selection()
                self.item = self.tree.item(self.selection[0])
                self.name = self.item["values"][0:3]
                for self.carName in self.name:
                    self.carName = self.carName
                    self.carLable = PhotoImage(file=fr"PhotoFolder\PhotoForDB\{self.carName}.png")
                    CustomWindow(self.carLable)

                LabelMain.destroy()
                SearchbuttonBack.destroy()

            EntButton = Button(text="Выбрать", font=("Bahnschrift Condensed", "25"), bg="#A9A9A9", borderwidth=0, command=ChangerCustom)
            EntButton.place(x=1470, y=151)

            columns = ("name", "tag")

            global tree
            self.tree = ttk.Treeview(columns=columns, show="headings", height=30)
            self.tree.place(x=350, y=150, width=900)

            self.tree.heading("name", text="Имя")
            self.tree.heading("tag", text="Тэг")

            global placeFind
            self.placeFind = ttk.Entry(width=50, font=("Bahnschrift Condensed", "40"))
            self.placeFind.place(x=350, y=30)

            def ChangerCustomWindow():
                LabelMain.destroy()
                SearchbuttonBack.destroy()
                MainMenu()

            def ChangerHangarWindow():
                LabelMain.destroy()
                SearchbuttonBack.destroy()
                HangarWindow()

            def CursorEnter(event):
                SearchbuttonBack["cursor"] = "hand2"

            LabelMain.create_rectangle(300, 0, 1600, 850, fill="#E6E6E6", outline="#696969")

            SearchbuttonBack = Button(text="<-- В главное меню   ", font=("Bahnschrift Condensed", "30"), width=25, bg="#FFEFD5", command=ChangerCustomWindow)
            SearchbuttonBack.place(x=60, y=900)

            HangarbuttonEnter = Button(text="   В мой гараж -->", font=("Bahnschrift Condensed", "30"), width=25, bg="#FFEFD5",command=ChangerHangarWindow)
            HangarbuttonEnter.place(x=1460, y=900)

            SearchbuttonBack.bind("<Enter>", CursorEnter)

        def CustomWindow(sCarName): #Создание виджетов редактора

            self.LabelMain = Canvas(bg="#A9A9A9", borderwidth=0, width=1980, height=1080)
            self.LabelMain.place(x=0, y=0)

            self.LabelMain.create_image(700, 400, image=sCarName)

            def Changer():
                self.LabelMain.destroy()
                SearchbuttonBack.destroy()
                SearchWindow()

            SearchbuttonBack = Button(text="<-- В меню поиска  ", font=("Bahnschrift Condensed", "30"), width=25,
                                      bg="#FFEFD5", command=Changer)
            SearchbuttonBack.place(x=60, y=900)

            adding = Button(text="Добавить", font=("Bahnschrift Condensed", "30"), width=25,
                                      bg="#FFEFD5")
            adding.place(x=500, y=900)

        def HangarWindow(): #Создание виджитов редактора

            LabelMain = Canvas(bg="#A9A9A9", borderwidth=0, width=1980, height=1080)
            LabelMain.place(x=0, y=0)

            def Changer():
                LabelMain.destroy()
                SearchbuttonBack.destroy()
                SearchWindow()

            SearchbuttonBack = Button(text="<-- В меню поиска  ", font=("Bahnschrift Condensed", "30"), width=25,
                                      bg="#FFEFD5", command=Changer)
            SearchbuttonBack.place(x=60, y=900)

        MainMenu()
        self.window.mainloop()

obj = Frame()

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

→ Ссылка