Python PIL int object not subscriptable
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 ;)
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, 2022Comments
-
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):
EDIT: the other images are in the comments because i can't put more than 1 link in my post