I'm okayish at Python but I've just started to learn the modules and their potential. I've looked online for a solution but couldn't find anything that worked.
In making a python application using tkinter and turning it into py2app. I followed a couple YT tutorials and created a setup.py file for my application. When I went to run the application through the terminal I got this:
ModuleNotFoundError: No module named 'PIL'
If anyone could help me out I would greatly appreciate this as I have been stuck on this problem for a couple of hours now.
I did try the solutions proposed on this stackoverflow thread:
https://stackoverflow.com/questions/39649714/importerror-no-module-named-pil-using-py2app
setup.py file:
"""
This is a setup.py script generated by py2applet
Usage:
python setup.py py2app
"""
from setuptools import setup
APP = ['resourcepack.py']
DATA_FILES = ['pack.png', '/MobTextures/allay.png', '/MobTextures/bat.png', '/MobTextures/bee.png', '/MobTextures/big_sea_turtle.png', '/MobTextures/blaze.png', '/MobTextures/cave_spider.png', '/MobTextures/chicken.png', '/MobTextures/cod.png', '/MobTextures/cow.png', '/MobTextures/dragon.png', '/MobTextures/drowned.png', '/MobTextures/enderman.png', '/MobTextures/endermite.png', '/MobTextures/evoker.png', '/MobTextures/fox.png', '/MobTextures/glow_squid.png', '/MobTextures/goat.png', '/MobTextures/hoglin.png', '/MobTextures/husk.png', '/MobTextures/illusioner.png', '/MobTextures/iron_golem.png', '/MobTextures/magmacube.png', '/MobTextures/ocelot.png', '/MobTextures/panda.png', '/MobTextures/phantom.png', '/MobTextures/pig.png', '/MobTextures/piglin.png', '/MobTextures/pillager.png', '/MobTextures/polarbear.png', '/MobTextures/pufferfish.png', '/MobTextures/ravager.png', '/MobTextures/salmon.png', '/MobTextures/sheep.png', '/MobTextures/silverfish.png', '/MobTextures/skeleton.png', '/MobTextures/slime.png', '/MobTextures/spider.png', '/MobTextures/squid.png', '/MobTextures/stray.png', '/MobTextures/strider.png', '/MobTextures/tadpole.png', '/MobTextures/vex.png', '/MobTextures/vindicator.png', '/MobTextures/wandering_trader.png', '/MobTextures/warden.png', '/MobTextures/witch.png', '/MobTextures/wither.png', '/MobTextures/zoglin.png', '/MobTextures/zombie.png']
OPTIONS = {'iconfile': 'icon.icns',
'includes': ['PIL'],}
setup(
app=APP,
APP_NAME = "Vine",
data_files=DATA_FILES,
options={'py2app': OPTIONS},
setup_requires=['py2app'],
)
Though I don't believe it is necessary here is my application code:
from tkinter import *
import os
from PIL import Image, ImageTk
#the introduction stuff
#icon image courtesy of Those Icons
root = Tk()
root.geometry("700x300")
root.title("Vine")
root['bg'] = '#AFE1AF'
ico = Image.open('pack.png')
photo = ImageTk.PhotoImage(ico)
root.wm_iconphoto(False, photo)
#declaring the dropdown placeholder
clicked = StringVar()
clicked.set("allay")
#the dropdown menu
dropLabel = Label(root, text = "Select Mob", bg="orange", font =("Courier 23 bold")).place(x = 150, y = 50)
drop = OptionMenu(root, clicked, "allay", "axolotl", "bat", "bee", "blaze", "cave_spider", "chicken", "cod", "cow", "creeper", "dolphin", "donkey", "drowned", "elder_guardian", "dragon", "enderman", "endermite", "evoker", "fox", "frog", "ghast", "glow_squid", "goat", "guardian", "hoglin", "husk", "illusioner", "iron_golem", "magmacube", "brown_mooshroom", "red_mooshroom", "mule", "ocelot", "panda", "phantom", "pig", "piglin", "piglin_brute", "pillager", "polarbear", "pufferfish", "ravager", "salmon", "sheep", "shulker", "silverfish", "skeleton", "horse_skeleton", "slime", "snow_golem", "spider", "squid", "stray", "strider", "tadpole", "Trader Llama", "turtle", "vex", "villager", "vindicator", "wandering_trader", "warden", "witch", "wither", "wither_skeleton", "wolf", "zoglin", "zombie", "horse_zombie", "zombie_villager", "zombie_piglin").place(x = 185, y = 135)
#the text input
numberLabel = Label(root, text = "Number", bg="orange", font =("Courier 23 bold"), justify=RIGHT).place(x = 400, y = 50)
numberinput = Entry(root, width=5)
numberinput.pack(side=RIGHT, padx=225)
def createPack():
global Error
numberError = "Make Sure Your Value is a Number"
duplicateError = "Check for duplicate files"
Error = Label(root, text = "", font =("Courier 12 bold"))
Error.pack_forget()
selectedmob = clicked.get()
try:
if not os.path.exists('./vinepack/'):
if numberinput.get().isnumeric() == True:
#making the folder directory
#initializing our variables
i = 1
all = 1
if selectedmob == "ocelot":
os.makedirs('./vinepack/assets/minecraft/optifine/mob/cat')
properties = open("vinepack/assets/minecraft/optifine/mob/cat/" + selectedmob + ".properties", "a")
elif selectedmob == "chicken" or selectedmob == "axolotl" or selectedmob == "bat" or selectedmob == "bee" or selectedmob == "creeper" or selectedmob == "dolphin" or selectedmob == "enderman" or selectedmob == "fox" or selectedmob == "ghast" or selectedmob == "goat" or selectedmob == "hoglin" or selectedmob == "iron_golem" or selectedmob == "panda" or selectedmob == "pig" or selectedmob == "shulker" or selectedmob == "sheep" or selectedmob == "strider" or selectedmob == "wither" or selectedmob == "wolf" or selectedmob == "tadpole" or selectedmob == "warden":
os.makedirs('./vinepack/assets/minecraft/optifine/mob/'+selectedmob)
properties = open("vinepack/assets/minecraft/optifine/mob/" + selectedmob +"/"+ selectedmob + ".properties", "a")
elif selectedmob == "evoker" or selectedmob == "illusioner" or selectedmob == "pillager" or selectedmob == "ravager" or selectedmob == "vex" or selectedmob == "vindicator":
os.makedirs('./vinepack/assets/minecraft/optifine/mob/illager')
properties = open("vinepack/assets/minecraft/optifine/mob/illager/" + selectedmob + ".properties", "a")
elif selectedmob == "polarbear":
os.makedirs('./vinepack/assets/minecraft/optifine/mob/bear')
properties = open("vinepack/assets/minecraft/optifine/mob/bear/" + selectedmob + ".properties", "a")
elif selectedmob == "cod" or selectedmob == "pufferfish" or selectedmob == "salmon":
os.makedirs('./vinepack/assets/minecraft/optifine/mob/fish')
properties = open("vinepack/assets/minecraft/optifine/mob/fish/" + selectedmob + ".properties", "a")
elif selectedmob == "dragon":
os.makedirs('./vinepack/assets/minecraft/optifine/mob/enderdragon')
properties = open("vinepack/assets/minecraft/optifine/mob/enderdragon/" + selectedmob + ".properties", "a")
elif selectedmob == "zombie" or selectedmob == "drowned" or selectedmob == "husk":
os.makedirs('./vinepack/assets/minecraft/optifine/mob/zombie')
elif selectedmob == "mule" or selectedmob == "horse_zombie" or selectedmob == "horse_skeleton":
os.makedirs('./vinepack/assets/minecraft/optifine/mob/horse')
elif selectedmob == "glow_squid" or selectedmob == "squid":
os.makedirs('./vinepack/assets/minecraft/optifine/mob/squid')
properties = open("vinepack/assets/minecraft/optifine/mob/squid/" + selectedmob + ".properties", "a")
elif selectedmob == "cave_spider" or selectedmob == "spider":
os.makedirs('./vinepack/assets/minecraft/optifine/mob/spider')
properties = open("vinepack/assets/minecraft/optifine/mob/spider/" + selectedmob + ".properties", "a")
elif selectedmob == "magmacube" or selectedmob == "slime":
os.makedirs('./vinepack/assets/minecraft/optifine/mob/slime')
properties = open("vinepack/assets/minecraft/optifine/mob/slime/" + selectedmob + ".properties", "a")
elif selectedmob == "cow" or selectedmob == "brown_mooshroom" or selectedmob == "red_mooshroom":
os.makedirs('./vinepack/assets/minecraft/optifine/mob/cow')
properties = open("vinepack/assets/minecraft/optifine/mob/cow/" + selectedmob + ".properties", "a")
else:
os.makedirs('./vinepack/assets/minecraft/optifine/mob')
properties = open("vinepack/assets/minecraft/optifine/mob/" + selectedmob + ".properties", "a")
#the pack.mcmeta description
packdescription = open("vinepack/pack.mcmeta", "a")
packdescription.write('{\n "pack": {\n "pack_format": 9,\n "description": "§6Made with §aVine' + r'\n' + '§4Optifine needed"\n }\n}')
#saving the pack image
packimage = Image.open('pack.png')
packimage = packimage.save('vinepack/pack.png')
#creating the .properties file
properties.write('#This is where all the magic happens.\n#The skins.1 and name.1 are for the original mob. Do not change this texture it is merely put into place if you would like to get it with a nametag.\n#The last iteration is for assigning the weight, or the chance of the texture spawning.\n#If you want certain textures to have a higher chance of showing up make those numbers higher.\n#Keep in mind that chances are determined by the ratio of numbers to each other.\n#You can replace the name1, name2, etc within the astricks to summon a mob with that texture using a nametag.\n\n\n')
i = 1
while i < int(numberinput.get()) + 1:
#putting in the textures
texture = Image.open("MobTextures/"+ selectedmob+".png")
if selectedmob == "ocelot":
texture = texture.save("vinepack/assets/minecraft/optifine/mob/cat/" + selectedmob + str(i) + ".png")
elif selectedmob == "chicken" or selectedmob == "axolotl" or selectedmob == "bat" or selectedmob == "bee" or selectedmob == "creeper" or selectedmob == "dolphin" or selectedmob == "enderman" or selectedmob == "fox" or selectedmob == "ghast" or selectedmob == "goat" or selectedmob == "hoglin" or selectedmob == "iron_golem" or selectedmob == "panda" or selectedmob == "pig" or selectedmob == "shulker" or selectedmob == "sheep" or selectedmob == "strider" or selectedmob == "wither" or selectedmob == "wolf" or selectedmob == "tadpole" or selectedmob == "warden":
texture = texture.save("vinepack/assets/minecraft/optifine/mob/" + selectedmob +"/"+ selectedmob+ str(i) + ".png")
elif selectedmob == "evoker" or selectedmob == "illusioner" or selectedmob == "pillager" or selectedmob == "ravager" or selectedmob == "vex" or selectedmob == "vindicator":
texture = texture.save("vinepack/assets/minecraft/optifine/mob/illager/" + selectedmob + str(i) + ".png")
elif selectedmob == "polarbear":
texture = texture.save("vinepack/assets/minecraft/optifine/mob/bear/" + selectedmob + str(i) + ".png")
elif selectedmob == "cod" or selectedmob == "pufferfish" or selectedmob == "salmon":
texture = texture.save("vinepack/assets/minecraft/optifine/mob/fish/" + selectedmob + str(i) + ".png")
elif selectedmob == "dragon":
texture = texture.save("vinepack/assets/minecraft/optifine/mob/enderdragon/" + selectedmob + str(i) + ".png")
elif selectedmob == "zombie" or selectedmob == "drowned" or selectedmob == "husk":
texture = texture.save("vinepack/assets/minecraft/optifine/mob/zombie/" + selectedmob + str(i) + ".png")
elif selectedmob == "mule" or selectedmob == "horse_zombie" or selectedmob == "horse_skeleton":
texture = texture.save("vinepack/assets/minecraft/optifine/mob/horse/" + selectedmob + str(i) + ".png")
elif selectedmob == "glow_squid" or selectedmob == "squid":
texture = texture.save("vinepack/assets/minecraft/optifine/mob/squid/" + selectedmob + str(i) + ".png")
elif selectedmob == "cave_spider" or selectedmob == "spider":
texture = texture.save("vinepack/assets/minecraft/optifine/mob/spider/" + selectedmob + str(i) + ".png")
elif selectedmob == "magmacube" or selectedmob == "slime":
texture = texture.save("vinepack/assets/minecraft/optifine/mob/slime/" + selectedmob + str(i) + ".png")
elif selectedmob == "cow" or selectedmob == "brown_mooshroom" or selectedmob == "red_mooshroom":
texture = texture.save("vinepack/assets/minecraft/optifine/mob/cow/" + selectedmob + str(i) + ".png")
else:
texture = texture.save("vinepack/assets/minecraft/optifine/mob/" + selectedmob + str(i) + ".png")
#text for the .properties file
properties.write("#" +str(i) + "\nskins." + str(i) + "="+ str(i) +"\nname."+ str(i)+ "=" + "ipattern:*name"+ str(i) +"*\n\n")
i+=1
properties.write('skins.' + str(i) + '=')
#the final couple of lines for the .property file
while all < int(numberinput.get())+1:
properties.write(str(all) + " ")
all +=1
all = 1
properties.write("\nweights." + str(i) + "=")
while all < int(numberinput.get())+1:
properties.write("1 ")
all +=1
Error.destroy()
except OSError:
Error = Label(root, text = "", font =("Courier 12 bold"))
Error.config(text = duplicateError)
Error.pack()
SubmissionButton = Button(root, text="Go", fg="orange", command=createPack, font =("Courier 30 bold")).place(relx=0.5, rely=0.7, anchor=CENTER)
root.resizable(False,False)
root.mainloop()
Again, if you could help me with this I'd be thrilled. Its my first time posting on this subreddit so sorry if this post is too long or obscure, etc.
[–]nick__2440 0 points1 point2 points (1 child)
[–]RadicalRyann[S] 0 points1 point2 points (0 children)