Pygame pas de chargement png après .exe avec Pyinstaller
J'ai essayé de faire un .exe de mon .py jeu et c'est vraiment frustrant.
Je suis à l'aide de Python 3.5.2, Pygame 1.9.2 et Pyinstaller 3.2.
Le jeu fonctionne parfaitement .py, mais après je entrer pyinstaller --debug game.py
, l' .exe est construit et je le lance, j'obtiens le suivant:
Ce sont les lignes de code à partir de game.py qui peuvent être liés à l'erreur:
from os import path
img_dir = path.join(path.dirname(__file__), 'sprites')
title_screen = pygame.image.load(path.join(img_dir, 'title_screen.png'))
Je pense qu'il doit avoir quelque chose à voir avec pyinstaler de ne pas être en mesure d'obtenir mes sprites dossier, parce que quand j'essaie d'exécuter pyinstaller --icon=/sprites/icon.ico game.py
, j'obtiens ceci:
Mais si j'utilise pyinstaller --icon=icon.ico game.py
il charge l'icône de l'amende juste.
Voici mon fichier spec:
# -*- mode: python -*-
block_cipher = None
added_files = [
( '/sprites', 'sprites' ),
( '/music', 'music' ),
( 'Heavitas.ttf', '.'),
( 'Roboto-Light.ttf', '.'),
( 'high scores.csv', '.')
]
a = Analysis(['spec_file.py'],
pathex=['C:\\Users\\rodri\\Documents\\Code\\The Color That Fell From The Sky'],
binaries=None,
datas=added_files,
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
exclude_binaries=True,
name='spec_file',
debug=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='spec_file')
OriginalL'auteur Rodrigo Nascimento | 2016-12-17
Vous devez vous connecter pour publier un commentaire.
Enfin!
Voici un guide rapide de ce que j'ai fait dans le cas où vous lisez ceci parce que vous avez un problème similaire. (J'ai utilisé Python, 3.5.2, Pygame 1.9.2 et Pyinstaller 3.2)
Préparer votre code
Comme le C._ explique sur l'autre réponse (merci), dans le cas où vous êtes le chargement des fichiers comme ceci:
Faire ceci à la place:
C'est nécessaire parce que quand vous congelez votre code, les fichiers sont va être déplacé vers un autre dossier que celui que vous avez utilisé avant. Assurez-vous que vous faites cela pour tous les fichiers.
Voici un autre exemple:
Icône (en option)
Si vous voulez une icône qui n'est pas pyinstaller par défaut, vous pouvez choisir une image png et le convertir .ico à l'aide de certains convertisseur en ligne (Google). Après cela, mettez le .ico, fichier sur le même dossier de votre .py fichier.
Faire le fichier de spec
À ce stade, vous devez savoir si vous voulez qu'un seul autonome .exe fichier ou un groupe de fichiers distincts qui vous permettra de zip et de les envoyer à des gens. En tout cas, ouvrez le terminal dans le dossier où votre .py fichier.
Si vous voulez qu'un seul fichier, utilisez ceci:
Si vous n'en avez pas, utilisez ceci:
Si vous ne souhaitez pas définir l'icône, il suffit de ne pas utiliser le
--icon
partie. Vous pouvez le changer plus tard. Ce que vous ne pouvez pas modifier plus tard est --onfichier option (au moins autant que je sache).Un fichier nommé game_file.spec va être créé. Il sera automatiquement le nom de game_file.py. Vous pouvez mess it up si ils ont des noms différents, donc ne soyez pas créatif aujourd'hui. Si vous avez choisi un fichier unique, il devrait ressembler à ceci:
Si vous avez choisi un tas de fichiers, vous allez voir ce supplément de la partie:
Après
block_cipher = None
tu vas ajouter les fichiers de votre jeu se charge. Comme ceci:Maintenant, vous devez ajouter " added_files ici:
Vous pouvez également modifier certains paramètres:
Si vous n'avez pas modifier le chemin d'accès ou le nom de la sortie de l'exe comme je vous ai dit de ne pas sur les commentaires, il suffit de l'exécuter et de le .exe fichier qui a été créé précédemment sera mis à jour. Entrez ce sur la fenêtre de commande:
Rappelez-vous que
game_file.spec
est le fichier que nous avons éditée et "game_file" est un nom aléatoire, j'ai utilisé comme exemple. Notez également qu'il n'y a pas--some_option
parce qu'ils ne fonctionnent pas avec le fichier spec. C'est pourquoi vous devez les modifier directement dans le script.--onefile
aussi ne fonctionne pas ici et ne peut pas être fait à partir du script, c'est pourquoi je vous ai dit de le faire avant.Vous va de soi que les deux dossiers ont été créées sur le même dossier dans lequel vous .le fichier spec. Celui qui est appelé 'Dist' contient le fichier exe et si vous n'utilisez pas
--onefile
, il devrait avoir aussi un tas d'autres fichiers que vous devez zip avec le fichier exe pour partager l'application avec d'autres personnes. Il y aura aussi un 'Construire' dossier mais je ne sais pas à quoi il sert, puisque vous n'avez pas besoin d'utiliser l'application.Alors, c'est tout. Il doit travailler pour vous.
Mes erreurs quand j'ai fait la question, que je ne connaissais pas le
sys._MEIPASS
partie (merci encore C._), le nom de mon fichier spec était différent de mes py fichier, j'ai utilisé'/sprites'
au lieu de'sprites'
dansadded_files
et je ne savais pas que je devais exécuter le fichier spec au lieu de la py fichier.Pour plus d'informations sur Pyinstaller, jetez un oeil à la manuel, mais vu que c'est loin d'être bonne et parfois trompeurs, vous êtes mieux avec Google.
OriginalL'auteur Rodrigo Nascimento
Lorsque vous compilez avec PyInstaller, tous les fichiers sont déplacés vers un autre répertoire lorsque vous exécutez votre
exe
. Donc, pour arriver à cet endroit, ajouter ceci au début de votre code, avant de générer des cheminsTous vos chemins d'accès au dossier peut alors être générée à partir de votre emplacement
Puis, quand vous avez de l'emplacement que vous êtes d'exécution, vous pouvez obtenir tous vos fichiers à partir de là :
Je vois aussi que vous avez d'autres polices/stuff, vous pouvez faire de même pour les charger
Pour votre icône, il suffit de coller un temporaire
icon.ico
dans votre dossier principal et le typepyinstaller -i "icon.ico" "spec_file.spec"
Enfin, comme j'ai eu le même problème avant, je vous recommande de compiler votre
exe
simplement en exécutantpyinstaller "spec_file.spec"
Suis allé, j'ai écrit "spec_file", je veux dire entrez le nom de votre fichier spec entre le "". Je suis désolé, c'est très ambigu. Sinon, il devrait alors fonctionner.
Je sais. Mes specs fichier est nommé " spec_file.spec'.
OriginalL'auteur C._