Megzari Nassim Megzari Nassim - 4 years ago 263
Python Question

Python PIL int object not subscriptable

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

Answer Source

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 ;)

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download