У объекта 'class' нет атрибута 'ImageTk' - PullRequest
0 голосов
/ 10 февраля 2020

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

AttributeError: у объекта 'Open_Template' нет атрибута 'ImageTk'

Может быть, кто-то может объяснить, что мне не хватает, чтобы передать ImageTk в класс?

from tkinter import *
from tkinter import messagebox
from PIL import ImageTk, Image
import datetime
import tkinter as tk
import webbrowser
import pytz
import openpyxl

class Main_App(tk.Tk):

    def __init__(self,*args,**kwargs):

        tk.Tk.__init__(self,*args,**kwargs)

        container = tk.Frame(self)
        container.pack(side="top",fill="both",expand=True)
        container.grid_rowconfigure(0, weight = 1)
        container.grid_columnconfigure(0, weight = 1)

        self.frames= {}

        for F in (test1,test2):

            frame = F(container, self)

            self.frames[F]=frame

            frame.grid (row=0, column = 0, sticky="nsew")

        self.show_frame(test1)

    def show_frame(self,cont):

        frame = self.frames[cont]
        frame.tkraise()

def SetMenu(self,parent,controller):

    Button1= tk.Button(self,relief='flat',command=lambda:controller.show_frame(test1))
    Button1.grid(column=0,row=0,sticky="nsew")
    Button1.config(image=self.ImageTk.PhotoImage(file ="image.gif"))


class test1(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self,parent)
        SetMenu(self,parent, controller)

class test2(tk.Frame):

    def __init__(self, parent, controller):

        tk.Frame.__init__(self,parent)
        SetMenu(self,parent, controller)

app=Main_App()
app.mainloop()

так, нашел способ сделать это работает. это

Button1=Button(self,bg="white",relief='flat',command=lambda:controller.show_frame(test1))
Button1.grid(column=0,row=0,sticky="nsew")
self.ph_im4 = ImageTk.PhotoImage(file = "image.gif")
Button1.config(image=self.ph_im4)

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

1 Ответ

2 голосов
/ 10 февраля 2020

Почему вы добавили себя в ImageTk?

Button1.config(image=ImageTk.PhotoImage(file ="image.gif"))

Если вам нужно предотвратить сборщик мусора:

def SetMenu(self,parent,controller):

    self.button1_image=ImageTk.PhotoImage(file ="image.gif")
    Button1= tk.Button(self,relief='flat',command=lambda:controller.show_frame(test1))
    Button1.grid(column=0,row=0,sticky="nsew")
    Button1.config(image=self.button1_image)
    Button1.image=self.button1_image

...