Python PIL int object not subscriptable

16,568

In fact i found the solution. My chev.png was a level of grey image, so his pixels value was a single integer, where as the other ones were tuples (R,G,B). So all i had to do was check the type of the pixel:

if type(p)==int:

then if it is an integer, he converts it into a tuple:

p=(p,p,p)

and you're all set ;)

Share:
16,568
Megzari Nassim
Author by

Megzari Nassim

I like video games alot, and i love programming, so I decided to learn programming to become a video game developper, and i'm aiming for Programming Engineer.

Updated on June 04, 2022

Comments

  • Megzari Nassim
    Megzari Nassim almost 2 years

    I have an image treatment program that is similar to photoshop but very simple (buttons and image display). In my program you can choose the image you want to use and modify. I'm currently working on a popart part of the program, but when I use an image of CheGevara (called "chev.png"), it gives the following error (the function is "def PopArt()"):

    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\EduPython\App\lib\tkinter\__init__.py", line 1538, in __call__
        return self.func(*args)
      File "C:\Users\omar\Desktop\azer\Test 1.py", line 52, in PopArt
        o=int((p[0]+p[1]+p[2])/3)
    TypeError: 'int' object is not subscriptable
    

    When I use other images like "fleur1.png" or "face.png", it works fine and displays the modification just fine. Here's the code:

    from tkinter import*
    import tkinter as Tkinter
    from tkinter import filedialog, DISABLED
    import os
    import ntpath
    from PIL import Image
    
    def EchelleDeGris():
        Ima2=Image.new("RGB",(z[0],z[1]))
        px=Ima1.load()
        px1=Ima2.load()
        for x in range(z[0]):
            for y in range(z[1]):
                p=px[x,y]
                o=int((p[0]+p[1]+p[2])/3)
                px1[x,y]=(o,o,o)
        Ima2.save("ImageMod.png")
        im2 = PhotoImage(file="ImageMod.png")
        main.image = im2
        I2 = Tkinter.Label(main, image=im2)
        I2.grid(row=0, column=3, rowspan =6)
    
    def SupprimerImage():
        I2 = Tkinter.Label(main, image=imt)
        I2.grid(row=0, column=3, rowspan =6)
    
    def Luminosite():
        Ima2=Image.new("RGB",(z[0],z[1]))
        px=Ima1.load()
        px1=Ima2.load()
        for x in range(z[0]):
            for y in range(z[1]):
                p=px[x,y]
                px1[x,y]=(p[0]+S1.get(),p[1]+S1.get(),p[2]+S1.get())
        Ima2.save("ImageMod.png")
        im2 = PhotoImage(file="ImageMod.png")
        main.image = im2
        I2 = Tkinter.Label(main, image=im2)
        I2.grid(row=0, column=3, rowspan =6)
    
    def AnnulerModifications():
        I2 = Tkinter.Label(main, image=im1)
        I2.grid(row=0, column=3, rowspan =6)
    
    def PopArt():
        Ima2=Image.new("RGB",(z[0],z[1]))
        px=Ima1.load()
        px1=Ima2.load()
        for x in range(z[0]):
            for y in range(z[1]):
                p=px[x,y]
                o=int((p[0]+p[1]+p[2])/3)
                if o<85:
                    px1[x,y]=(0,0,255)
                elif 85<o<170:
                    px1[x,y]=(0,255,0)
                elif o>170:
                    px1[x,y]=(255,0,0)
        Ima2.save("ImageMod.png")
        im2 = PhotoImage(file="ImageMod.png")
        main.image = im2
        I2 = Tkinter.Label(main, image=im2)
        I2.grid(row=0, column=3, rowspan =6)
    
    
    
    
    
    
    main=Tk()
    
    main.withdraw()
    currdir = os.getcwd()
    a = filedialog.askopenfilename()
    main.deiconify()
    
    main.configure(background="#a1dbcd")
    main.title("Photoshop Version.Megzari")
    
    Ima1=Image.open(a)
    z=Ima1.size
    nux=Image.new("RGB",(z[0],z[1]))
    nuxy=nux.load()
    for x in range(z[0]):
        for y in range(z[1]):
            nuxy[x,y]=(255,255,255)
    nux.save("Blank.png")
    
    
    
    
    
    
    
    
    if z>(400,400):
        im2 = Tkinter.PhotoImage(file="ImageBlank.png")
        main.image = im2
        I2 = Tkinter.Label(main, image=im2)
        I2.grid(padx=20, pady=20, row=0, column=1, rowspan =6)
        T1 = Tkinter.Label(main, image=im2)
        T1.grid(padx=20, pady=20, row=0, column=3, rowspan =6)
        B1 = Tkinter.Button(main, text ="Echelle de gris", command = EchelleDeGris, fg="#a1dbcd", bg="#383a39", state=DISABLED)
        B1.grid(padx=20, pady=20, row=0, column=2)
        B3 = Tkinter.Button(main, text ="Appliquer Luminosité", command = Luminosite, fg="#a1dbcd", bg="#383a39", state=DISABLED)
        B3.grid(padx=20, pady=20, row=2, column=2)
        S1 = Scale(main, from_=0, to=254, orient=HORIZONTAL, fg="#a1dbcd", bg="#383a39", state=DISABLED, length = 200)
        S1.grid(row=1, column=2)
        B2 = Tkinter.Button(main, text ="Supprimer Image", command = SupprimerImage, fg="#a1dbcd", bg="#383a39", state=DISABLED)
        B2.grid(padx=20, pady=20, row=4, column=2)
        B3 = Tkinter.Button(main, text ="Annuler Modifications", command = AnnulerModifications, fg="#a1dbcd", bg="#383a39", state=DISABLED)
        B3.grid(padx=20, pady=20, row=3, column=2)
        B4 = Tkinter.Button(main, text ="Pop Art", command = PopArt, fg="#a1dbcd", bg="#383a39", state=DISABLED)
        B4.grid(padx=20, pady=20, row=5, column=2)
    elif z<(400,400):
        im1 = Tkinter.PhotoImage(file=a)
        I1 = Tkinter.Label(main, image=im1)
        I1.grid(padx=20, pady=20, row=0, column=1, rowspan =6)
        imt = Tkinter.PhotoImage(file="Blank.png")
        T1 = Tkinter.Label(main, image=imt)
        T1.grid(padx=20, pady=20, row=0, column=3, rowspan =6)
        B1 = Tkinter.Button(main, text ="Echelle de gris", command = EchelleDeGris, fg="#a1dbcd", bg="#383a39", state=NORMAL)
        B1.grid(padx=20, pady=20, row=0, column=2)
        B3 = Tkinter.Button(main, text ="Appliquer Luminosité", command = Luminosite, fg="#a1dbcd", bg="#383a39")
        B3.grid(padx=20, pady=20, row=2, column=2)
        S1 = Scale(main, from_=0, to=254, orient=HORIZONTAL, fg="#a1dbcd", bg="#383a39", length = 200)
        S1.grid(row=1, column=2)
        B2 = Tkinter.Button(main, text ="Supprimer Image", command = SupprimerImage, fg="#a1dbcd", bg="#383a39")
        B2.grid(padx=20, pady=20, row=4, column=2)
        B3 = Tkinter.Button(main, text ="Annuler Modifications", command = AnnulerModifications, fg="#a1dbcd", bg="#383a39")
        B3.grid(padx=20, pady=20, row=3, column=2)
        B4 = Tkinter.Button(main, text ="Pop Art", command = PopArt, fg="#a1dbcd", bg="#383a39")
        B4.grid(padx=20, pady=20, row=5, column=2)
    
    s=S1.get()
    
    
    
    
    main.mainloop()
    

    Here are the images I used (all of them are png, but chev.png and fleur.png were converted from jpg, and fleur1.png was resized from fleur.png):

    chev.png

    EDIT: the other images are in the comments because i can't put more than 1 link in my post