Как разместить изображение на tkinter

#tkinter #tkinter-canvas

#tkinter #tkinter-холст

Вопрос:

У меня возникли проблемы с отображением моего изображения на моей странице в одном из графических интерфейсов

 from tkinter import *
from tkinter import ttk

LARGE_FONT= ("Verdana", 20)

class MyApp(Tk):

    def __init__(self):
        Tk.__init__(self)
        container = ttk.Frame(self)
        container.pack(side="top", fill="both", expand = True)
        self.frames = {}
        for F in (PageOne, PageTwo):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky = NSEW)
        self.show_frame(PageOne)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()

    def get_page(self, classname):
        '''Returns an instance of a page given it's class name as a string'''
        for page in self.frames.values():
            if str(page.__class__.__name__) == classname:
                return page
        return None  
 

Я хотел бы разместить изображение на странице, но у меня нет атрибута для canvas. Означает ли это, что я не могу его использовать?
Я удалил Pagetwo, чтобы мой код был меньше и не занимал много места

 class PageOne(ttk.Frame):
    def __init__(self, parent, controller):
        ttk.Frame.__init__(self, parent)
        ttk.Label(self, text='Home Page', font=LARGE_FONT).grid(padx=(400,400), pady=(50,50))
        self.controller = controller
        self.make_widget(controller)

# Image 
        canvas = ttk.Canvas(self, width = 1000, height = 1000)
        canvas.grid()
        image = self.Image(file="mypicture.png")
        canvas.create_image(480, 258, image = image, anchor = ttk.NW)

    def make_widget(self, controller):
        self.v = StringVar()
        self.v.set("a")

        button1 = ttk.Button(self, text="Dispensing", command=self.validate)
        button1.grid(padx=20, pady=30)

        button2 = ttk.Button(self, text='Settings',
                              command=lambda: controller.show_frame(PageTwo))
        button2.grid(padx=20, pady=20)        

    def validate(self):
       value = self.v.get()
       if value == "a":
           print("Small Amount Dispensing")

app = MyApp()
app.title('Multi-Page Test App')
app.mainloop()
 

Ответ №1:

Вы создаете изображение внутри функции, и когда функция завершается, ссылка на изображение будет собрана мусором. Вы должны сохранить ссылку на изображение. Изучите приведенный ниже код:

 # Image
canvas = Canvas(self, width = 1000, height = 1000)
canvas.grid()
image = PhotoImage(file="mypicture.png")
canvas.create_image(480, 258, image=image, anchor=NW)
canvas.image = image    # Save a reference to the image
 

Насколько я знаю ttk.Canvas , виджета нет; используйте виджет tkinter. То же самое с ttk.NW .

Функция для создания изображения PhotoImage .