2016-04-18 39 views
1
img_l = pygame.image.load("img.png") 
screen.blit(img_l) 

Mit Python-Interpreter es funktioniert gut, Bild Lasten und main.py läuft ohne Probleme, aber wenn ich es in eine Datei .exe mit Pyinstaller, .exe stürzt ab.Pygame.image.load() nicht mit PyInstaller Arbeits

Ich habe einige wenige .spec Modifikationen versucht, aber nur wenige, die ich gefunden habe, scheinen nicht zu helfen.

Alle Ideen herzlich willkommen.

EDIT: habe es mit Arbeit:

img_l = pygame.image.load(os.path.join('img.png')) 
screen.blit(img_l, (0, 0)) 

Jetzt funktioniert es, wie es sollte nach PyInstaller :)

+1

Erhalten Sie einen Ausnahme-Traceback, wenn Ihr Programm abstürzt? Es ist schwierig, ein Problem ohne Informationen zu diagnostizieren. Meine erste Vermutung wäre, dass 'img.png' nicht geladen werden kann, weil es nicht an dem Ort ist, an dem Ihr Programm es erwartet. – Blckknght

+0

Alles, was ich bekomme 'fataler Fehler: Main zurückgegeben -1'. Ich habe versucht, 'img.png' an derselben Stelle wie' .exe' hinzuzufügen, funktioniert nicht. Von dem, was du gesagt hast, habe ich gerade die Idee bekommen, dass 'img.png' an der gleichen Stelle wie PyInstaller sein muss ... werde EDIT testen: nein. –

+1

Es könnte sich lohnen, eine Zeile hinzuzufügen, um das aktuelle Arbeitsverzeichnis auszudrucken. Auf diese Weise können Sie genau sehen, wo die Anwendung nach der Datei sucht. 'import os; print os.getcwd(); ' –

Antwort

0

bekam durchlaufen sie mit Arbeit:

img_l = pygame.image.load(os.path.join('img.png')) 
screen.blit(img_l, (0, 0)) 

it Now funktioniert wie es sollte nach dem Durchlaufen von PyInstaller :)

1

Entschuldigung, ich bin sehr neu im Programmieren. Ich erhalte eine ähnliche (gleich?) Fehler, wenn ich versuche, meine laufen .exe Dort heißt es:

pygame.error: Couldn't open walkr1.png 

ich das Update versucht, die Sie verwendet, aber dann bekam den Fehler:

pygame.error: Can't seek in this data source 

Die Bilddateien befinden sich in einem Ordner im Ordner mit der Hauptdatei .py. Ich habe versucht, die Dateien in den gleichen Ordner zu verschieben, aber das hat nicht funktioniert. Ich habe auch versucht, die Dateien in die Datei .spec hinzufügen, aber das scheint auch nicht zu funktionieren ... Warst du gefragt, ob Sie helfen könnten? Sorry, ich weiß, das sind wahrscheinlich alles sehr dumme Fragen.

0

Für alle anderen, die das gleiche Problem haben und die Antwort von @ Esa ausprobiert haben, stellen Sie möglicherweise fest, dass sie manchmal nicht funktioniert, wenn sie außerhalb des Verzeichnisses ausgeführt wird. Dies wird dadurch verursacht, dass Pyinstaller immer noch versucht, den relativen Pfad zu finden und stattdessen die enthaltenen Dateien verwendet. Dies kann durch die Suche nach dem richtigen Pfad in Ihrem Code vor dem Laden von Dateien festgelegt werden:

if getattr(sys, 'frozen', False): 
    Path = sys._MEIPASS    #This is for when the program is frozen 
else: 
    Path = os.path.dirname(__file__) #This is when the program normally runs 

Dieser den tatsächlichen Pfad der Datei findet und muss für jede Datei durchgeführt werden, zum Beispiel:

pygame.image.load(os.path.join(Path, 'Path\\to_file\\from_root')) 

sys._MEIPASS ist der Schlüssel, da er den Pfad findet, wenn das Programm eingefroren ist, wie wenn ein Programm eingefroren ist, seine Dateien werden woanders gespeichert.

Wenn Sie die .exe-Datei generieren, wird auch eine .spec-Datei mit dem Stammverzeichnis erstellt. Dort müssen Sie diese wie folgt bearbeiten:

  1. Sie sollten eine Dateistruktur ähnlich dem unter
  2. Hinweis sehen, wie datas zu None gleich ist. Sie müssen dies bearbeiten.

Dies ist die .spec-Datei im Stammverzeichnis zur Zeit:

# -*- mode: python -*- 

block_cipher = None 

#you will have to add things here later 

a = Analysis(['file.py'], 
      pathex=['C:\\path\\to\\root\\folder'], 
      binaries=None, 
      datas=None, 
      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='game_file', 
      debug=False, 
      strip=False, 
      upx=True, 
      console=True , icon='icon_file.ico') 

Nun, was wir tun, ist, dass wir alle unsere Dateien hinzufügen: diese added_files unter block_cipher Place, aber oberhalb Analysis(), zB:

added_files = [ 
       ('file1.png', '.')  #The '.' represents root folder 
       ('file2.png', '\\folder') #loads file2.png from root\folder 
       ] 

Jetzt innerhalb von Analysis() ändern wir die None nach datas zu added_files. Sie werden auch bemerken, dass es die wichtigsten Optionen für Ihre endgültige Datei gibt. Sie können diese hier bearbeiten, wenn Sie möchten, aber Sie können die "Einzeldatei" -Option nicht ändern, dies wird gemacht, wenn die .spec-Datei erstellt wird.

schließlich diese neue EXE-Datei zu machen, gehen Sie zu Ihrem Stammordner in cmd und geben Sie diese:

pyinstaller "PY_FILE_NAME.spec" 

Den letzten exe, ob in einem Ordner oder nicht in root \ dist \ Executable_name.exe sein sollte oder root \ dist \ Executable_name \ Executable_name.exe