Как вывести изображение из метода, в котором мы задаем название изображение 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 шт):
Все решилось благодаря гайду, вот он --> 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()

