Visual Studio Code ile yapılan pygame oyun nasıl dışarı EXE olarak aktarılır?

yilmazefebcir

Decapat
Katılım
8 Eylül 2023
Mesajlar
519
Çözümler
1
Daha fazla  
Cinsiyet
Erkek
Visual Studio Code ile yaptığım pygame oyunumu nasıl dışarı EXE veya ZIP dosyası olarak aktarabilirim? Oyunda görseller var.
 
PyInstaller diye bir kütüphane var, daha önce pek çok kez kullandım. Eğer (basit ama) consoldan yazmak istemiyorsanız auto-py-to-exe diye bir kütüphane var, o da PyInstaller altyapısını kullanıyor ama GUI de içeriyor. Ama resimleri direkt exeye ekleyemiyorsunuz diye biliyorum. Kodda belirttiğiniz dizinde olmalı.
 
PyInstaller diye bir kütüphane var, daha önce pek çok kez kullandım. Eğer (basit ama) consoldan yazmak istemiyorsanız Auto-py-to-EXE diye bir kütüphane var, o da PyInstaller altyapısını kullanıyor ama GUI de içeriyor. Ama resimleri direkt EXE'ye ekleyemiyorsunuz diye biliyorum. Kodda belirttiğiniz dizinde olmalı.

Peki resimleri ZIP dosyasında daha rahat bir şekilde birleştirebilir miyim?
 
PyInstaller'ın --onedir ayarı ile programınızı paketleyebilirsiniz.
Programınızın ana .exe dosyası ve gerekli kütüphaneleri bir klasörde toplar.
Resimlerinizi de buraya kopyalarsınız.
Tüm klasörü zipleyerek dağıtabilirsiniz.

--onefile olanı tavsiye etmem, çünkü; aslında yaptığı şey, herşeyi paketleyip, paketten çıkaran, kapsayıcı bir .exe yaratmak. Yani bu gerçek anlamıyla, makina koduna dönüştürülmüş bir .exe yapmıyor, bir paketleyici->paketten çıkarıcı hazırlıyor.

Bu yüzden, hız olarak, --onedir, --onefile'dan daha hızlı olabiliyor:

PyInstaller's bootloader is usually quite fast in one-dir mode, but it can be much slower in one-file mode, because it depacks everything into a temporary directory. On Windows, I/O is very slow, and then you have antiviruses that will want to double check all those DLL files.

çevirelim:

PyInstaller'ın önyükleyicisi genellikle onedir modunda oldukça hızlıdır, ancak onefile modunda çok daha yavaş olabilir, çünkü her şeyi geçici bir dizine paketler. Windows'ta I/O yavaştır ve daha sonra tüm bu DLL dosyalarını iki kez kontrol etmek isteyecek antivirüsleriniz olur.
 
Resimler için bu konuya bakabilirsiniz.
 
PyInstaller'ın --onedir ayarı ile programınızı paketleyebilirsiniz.
Programınızın ana .exe dosyası ve gerekli kütüphaneleri bir klasörde toplar.
Resimlerinizi de buraya kopyalarsınız.
Tüm klasörü zipleyerek dağıtabilirsiniz.

--onefile olanı tavsiye etmem, çünkü; aslında yaptığı şey, her şeyi paketleyip, paketten çıkaran, kapsayıcı bir .exe yaratmak. Yani bu gerçek anlamıyla, makine koduna dönüştürülmüş bir .exe yapmıyor, bir paketleyici->paketten çıkarıcı hazırlıyor.

Bu yüzden, hız olarak, --onedir, --onefile'dan daha hızlı olabiliyor:

Çevirelim:

Anladım, ama bak ben yaptığım oyunu kendi dosyasındayken açabiliyorken başka bir yere çıkarınca açılmıyor yani imagesları tanımlayamıyor.
 
Sorunu görmek için mini bir proje yarattım (ChatGPT yardımıyla), sonra da onu çalışır hale getirdim.

Görünüşe göre, --add-data parametresini eklemek gerekiyor.

Ayrıca, en önemlisi, Python script haliyle, paketlenmiş haldeki script'in path'i aynı değil. Sorun da bu yüzden çıkıyor. Aşağıda bir print() satırı ekledim, doğru path'i gösteriyor.

Belki sizde çok daha fazla resim vardır, daha genel bir şekilde ele almak gerekir, ama, bu kod sorunu gösteren ve path farkını ortaya koymak amacıyla var.

Dosyalarımız şu şekilde:

Kod:
alien.png
pack.sh
simple_game.py

Resimi kullanan kod:

Python:
import pygame
import sys
import os

pygame.init()

WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Simple Pygame - Load Image")

if getattr(sys, 'frozen', False):
    # eğer paketlenmiş ise
    print('sys._MEIPASS', sys._MEIPASS)
    image_path = os.path.join(sys._MEIPASS, 'alien.png')
else:
    # paketlenmeden açık çalışıyorsa
    image_path = 'alien.png'

try:
    alien_image = pygame.image.load(image_path)
    alien_rect = alien_image.get_rect()
    alien_rect.topleft = (100, 100)
except pygame.error as e:
    print(f"Error loading image: {e}")
    sys.exit()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    screen.fill((255, 255, 255))

    screen.blit(alien_image, alien_rect)

    pygame.display.flip()

    pygame.time.Clock().tick(60)

pygame.quit()
sys.exit()

paketleyici (Linux shell script formatında, ama pyinstaller komutu Windows'da da aynı olmalı):

Bash:
#!/bin/bash

clear
pyinstaller --clean --onedir --add-data "alien.png:." simple_game.py
 
Sorunu görmek için mini bir proje yarattım (ChatGPT yardımıyla), sonra da onu çalışır hale getirdim.

Görünüşe göre, --add-data parametresini eklemek gerekiyor.

Ayrıca, en önemlisi, Python script haliyle, paketlenmiş haldeki Script'in Path'i aynı değil. Sorun da bu yüzden çıkıyor. Aşağıda bir print() satırı ekledim, doğru Path'i gösteriyor.

Belki sizde çok daha fazla resim vardır, daha genel bir şekilde ele almak gerekir, ama, bu kod sorunu gösteren ve path farkını ortaya koymak amacıyla var.

Dosyalarımız şu şekilde:

Kod:
alien.png
pack.sh
simple_game.py

Resimi kullanan kod:

Python:
import pygame.
import sys.
import os.

pygame.init()

WIDTH, HEIGHT = 800, 600.
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Simple Pygame - Load Image")

if getattr(sys, 'frozen', False):
 # eğer paketlenmiş ise.
 print('sys._MEIPASS', sys._MEIPASS)
 image_path = os.path.join(sys._MEIPASS, 'alien.png')
else:
 # paketlenmeden açık çalışıyorsa.
 image_path = 'alien.png'

try:
 alien_image = pygame.image.load(image_path)
 alien_rect = alien_image.get_rect()
 alien_rect.topleft = (100, 100)
except pygame.error as e:
 print(f"Error loading image: {e}")
 sys.exit()

running = True.
while running:
 for event in pygame.event.get():
 if event.type == pygame.QUIT:
 running = False.

 screen.fill((255, 255, 255))

 screen.blit(alien_image, alien_rect)

 pygame.display.flip()

 pygame.time.Clock().tick(60)

pygame.quit()
sys.exit()

Paketleyici (Linux Shell script formatında, ama PyInstaller komutu Windows'ta da aynı olmalı):

Bash:
#!/bin/bash

clear.
pyinstaller --clean --onedir --add-data "alien.png:." simple_game.py

Hocam ZIP halinde yapsam? Çünkü ChatGPT'de EXE'yi bende sordum yapımı uzun sürüyor direkt bence ZIP halinde yapsam daha kısa olur. Sizce öyle nasıl yapabilirim?
 

Bu konuyu görüntüleyen kullanıcılar

Technopat Haberler

Yeni konular

Geri
Yukarı