Yazdığım projeyi .exe yapıp çalıştıramıyorum

Python’da yeniyim. 4 gün önce yazmaya başladım. Kolay bir proje aradım ve Flappy Bird’ü buldum. Dün yazmayı bitirdim. Programı .exe’ye dönüştürmek istedim kullanmak için. ve bir şey denedim. ama ne yaptıysam işe yaramadı. bu sorunun basit bir sorun olduğunu düşünüyorum. ama çözemiyorum. .exe yapmak için “pyinstaller” kullandım. Lütfen yardım edin. .exe ye çevirdim ama çalıştırmaya çalıştırdığım an komut penceresi açılıp kapanıyor. bir hata veriyor. cmd ekranındaki hatanın ss i var.

Merhabalar.
Program assets/sprites adlı bir dizini bulamıyor galiba. Kodunuzu paylaşabilirmisiniz.

Tabiki:
import pygame

import assets
import configs
from objects.background import Background
from objects.bird import Bird
from objects.column import Column
from objects.floor import Floor
from objects.gameover_message import GameOverMessage
from objects.gamestart_message import GameStartMessage
from objects.score import Score

pygame.init()

screen = pygame.display.set_mode((configs.SCREEN_WIDTH, configs.SCREEN_HEIGHT))
clock = pygame.time.Clock()
column_create_event = pygame.USEREVENT
running = True
gameover = False
gamestarted = False

assets.load_sprites()
assets.load_audios()

sprites = pygame.sprite.LayeredUpdates()

def create_sprites():
Background(0, sprites)
Background(1, sprites)
Floor(0, sprites)
Floor(1, sprites)

return Bird(sprites), GameStartMessage(sprites), Score(sprites)

bird, game_start_message, score = create_sprites()

while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == column_create_event:
Column(sprites)
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE and not gamestarted and not gameover:
gamestarted = True
game_start_message.kill()
pygame.time.set_timer(column_create_event, 1500)
if event.key == pygame.K_ESCAPE and gameover:
gameover = False
gamestarted = False
sprites.empty()
bird, game_start_message, score = create_sprites()

    bird.handle_event(event)

screen.fill(0)

sprites.draw(screen)

if gamestarted and not gameover:
    sprites.update()

if bird.check_collision(sprites) and not gameover:
    gameover = True
    gamestarted = False
    GameOverMessage(sprites)
    pygame.time.set_timer(column_create_event, 0)
    assets.play_audio("hit")

for sprite in sprites:
    if type(sprite) is Column and sprite.is_passed():
        score.value += 1
        assets.play_audio("point")

pygame.display.flip()
clock.tick(configs.FPS)

pygame.quit()

bu benim yazdığım projenin ana dosyası. ismi de main.

Kodunuzu şuraya göre tekrar düzenleyip atarmısınız:

Ben bu attığınız yazıyı okudum. Fakat benim attığım kod ile alakalandırabileceğim bir yeri göremedim. Yanlış bir şey mi yaptım acaba?

1 Beğeni

Ben kodları yazdıktan sonra teminalden “pyinstaller” 'ı kurdum. Sonra da bu yazdığım projeyi .exe yapmak için uğraştım. Araştırmalarım sonucu, “pyinstaller --onefile main.py” yapma kararı aldım, ve yaptım. Ama sonra sıra “dist” klasöründeki .exe’yi açmaya geldiğinde bir türlü yapamadım. Sanırım daha açık oldu.


Bu da benim yapmaya çalıştığım projenin PyCharm üzerindeki görüntüsü.

Pardon yanlış linki atmışım kusura bakmayın. Şuraya göre düzenlemeniz gerekiyorki oython kodunuzun girintileri düzgün gözükebilsin:

import pygame

import assets
import configs
from objects.background import Background
from objects.bird import Bird
from objects.column import Column
from objects.floor import Floor
from objects.gameover_message import GameOverMessage
from objects.gamestart_message import GameStartMessage
from objects.score import Score

pygame.init()

screen = pygame.display.set_mode((configs.SCREEN_WIDTH, configs.SCREEN_HEIGHT))
clock = pygame.time.Clock()
column_create_event = pygame.USEREVENT
running = True
gameover = False
gamestarted = False

assets.load_sprites()
assets.load_audios()

sprites = pygame.sprite.LayeredUpdates()


def create_sprites():
    Background(0, sprites)
    Background(1, sprites)
    Floor(0, sprites)
    Floor(1, sprites)

    return Bird(sprites), GameStartMessage(sprites), Score(sprites)


bird, game_start_message, score = create_sprites()

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == column_create_event:
            Column(sprites)
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE and not gamestarted and not gameover:
                gamestarted = True
                game_start_message.kill()
                pygame.time.set_timer(column_create_event, 1500)
            if event.key == pygame.K_ESCAPE and gameover:
                gameover = False
                gamestarted = False
                sprites.empty()
                bird, game_start_message, score = create_sprites()

        bird.handle_event(event)

    screen.fill(0)

    sprites.draw(screen)

    if gamestarted and not gameover:
        sprites.update()

    if bird.check_collision(sprites) and not gameover:
        gameover = True
        gamestarted = False
        GameOverMessage(sprites)
        pygame.time.set_timer(column_create_event, 0)
        assets.play_audio("hit")

    for sprite in sprites:
        if type(sprite) is Column and sprite.is_passed():
            score.value += 1
            assets.play_audio("point")

    pygame.display.flip()
    clock.tick(configs.FPS)

pygame.quit()

oldu sanırım.

1 Beğeni

assets.py dosyasını atarmısınız. Sorun o dosyadaki onuncu satırdan kaynaklanıyor. Muhtemelen assets dosyalarını yüklediğiniz klasörü pyinstaller doğru çevirememiş.

Bu kaynakta resim dosyalarının paketlenmesi gerektiğinden bahsediliyor isterseniz bakabilirsiniz:

Tam olarak anlamadım. Şimdi ben assets dosyalarını mı paketleyeyim yoksa assets i buraya mı atayım?

İlk olarak assets.py dosyasını buraya atın, sonrada attığım linkteki çözümü deneyebilirsiniz. Bide assets/sprites klasöründe tam olarak ne tür dosyalar var ona göre bir çözüm bulabiliriz.

assets:

import os
import pygame

sprites = {}
audios = {}


def load_sprites():
    path = os.path.join("assets", "sprites")
    for file in os.listdir(path):
        sprites[file.split('.')[0]] = pygame.image.load(os.path.join(path, file))


def get_sprite(name):
    return sprites[name]


def load_audios():
    path = os.path.join("assets", "audios")
    for file in os.listdir(path):
        audios[file.split('.')[0]] = pygame.mixer.Sound(os.path.join(path, file))


def play_audio(name):
    audios[name].play()

“Sprites” klasöründe ise “Flappy Bird” oyunundan bildiğiniz üzere sütunlar, kuş, arka plan vs. oyun resimleri var.

Pyinstaller exeye dönüştürme işlemi için resimler ve fontlar ile --collect-data parametresi kullanılmış:

Benim kendimde mi sorun var anlayamadım ama. Ben bunu beceremedim. Verdiğin kaynak tam olarak benim sorunumu çözüyor. Ama ben bişey anlayamadım oradan. Yazımın da başında belirtiğim gibi yeniyim bu Dünyada. Hangi kodları nereye yazacağım konusunda zorlanıyorum.

def resource_path(relative_path):
    try:
    # PyInstaller creates a temp folder and stores path in _MEIPASS
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")

bu kodu assets 'e ekledim. tabii os ve sys ile. Sonra tekrardan “pyinstaller --onefile --collect-data assets/sprites” dedim. Tekrardan “dist” klasörü oluştu. Fakat aynı sorun hala vardı.

asset klasörünü ve içindekileri kendin el ile kopyala yapıştır yaparak .exe nin olduğu yere koy.
bunu yaptıktan sonra düzelirse ve .dll uzantılı bir şeyleri bulamazsa onları da internette ara indirip ilgili yerlere koy.