когда я хочу использовать pyinstaller для упаковки моего python скрипта, что мне делать, если я хочу использовать «pygame.font.SysFont» в моем скрипте? - PullRequest
1 голос
/ 19 февраля 2020

Я сделал свою простую игру с пакетом pygame , и она хорошо работает на моем python редакторе
, поэтому я попытался упаковать этот файл через pyinstaller
Как результат, EXE-файл был успешно собран. но когда я запускаю этот файл, этот файл закрывается сразу после открытия.

, поэтому я попытался отладить свой скрипт и, наконец, обнаружил, что проблема заключается в pygame.font.SysFont
, когда я не использовал pygame.font.SysFont и упаковать этот скрипт через pyinstaller , я мог играть в мою игру успешно
, но если я попытался хотя бы один раз использовать pygame.font.SysFont в своем скрипте и упаковать этот скрипт через pyinstaller , я не смогу играть в мою игру, потому что этот файл (exe выходной файл pyinstaller) закрывается сразу после открытия.

Если кто-нибудь знает об этой проблеме, пожалуйста, сообщите мне
Спасибо

import sys
import os
import random
import pygame as pg
from pygame.locals import QUIT, Rect, KEYDOWN, K_SPACE, K_r


def main():

    game_over = False
    ship_y = 250
    velocity = 0
    score = 0
    slope = random.randint(1, 6)
    walls = 160
    holes = []
    for xpos in range(walls):
        holes.append(Rect(xpos * 5, 100, 5, 400)) 

    parent_path = os.getcwd()
    ship_img = pg.image.load(os.path.join(parent_path, "img\\ship.png"))
    bang_img = pg.image.load(os.path.join(parent_path, "img\\bang.png"))


    while True:
        space_down = False
        for event in pg.event.get():
            if event.type == QUIT:
                pg.quit()
                sys.exit()
            elif event.type == KEYDOWN:
                if event.key == K_SPACE:
                    space_down = True

        if not game_over:
            score += 10
            velocity += -3 if space_down else 3
            ship_y += velocity

            # Scroll map automatically
            edge = holes[-1].copy()
            test = edge.move(0, slope)
            if test.top <= 0 or test.bottom >= 600:
                slope = random.randint(1, 6) * (-1 if slope > 0 else 1)
                if edge.height >= 160:
                    edge.inflate_ip(0, -20)

            edge.move_ip(5, slope)
            holes.append(edge)
            del holes[0]
            holes = [x.move(-5, 0) for x in holes]

            # Check crash
            if holes[0].top > ship_y or holes[0].bottom < ship_y + 50:
                game_over = True

        SURFACE.fill((0, 255, 0))
        for hole in holes:
            pg.draw.rect(SURFACE, (0, 0, 0), hole)
        SURFACE.blit(ship_img, (0, ship_y))

        score_board = SYSFONT.render(f"score : {score}", True, (0, 0, 225)) # I have to comment out this line
        SURFACE.blit(score_board, (600, 20))

        if game_over:

            end_msg = SYSFONT.render(f"press R to restart", True, (255, 255, 255)) # I have to comment out this line
            cal_level = int((400 - holes[0].height) / 20)
            level = SYSFONT.render(f"level : {cal_level}", True, (255, 0, 0)) # I have to comment out this line
            SURFACE.blit(end_msg, (320, 200))
            SURFACE.blit(level, (370, 240))
            SURFACE.blit(bang_img, (0, ship_y - 40))

            pg.display.update()

            while True:
                for event in pg.event.get():
                    if event.type == KEYDOWN:
                        if event.key == K_r:
                            game_over = False

                if not game_over:
                    ship_y = 250
                    velocity = 0
                    score = 0
                    slope = random.randint(1, 6)
                    holes = []
                    for xpos in range(walls):
                        holes.append(Rect(xpos * 5, 100, 5, 400))
                    break


        pg.display.update()
        FPS.tick(30)


if __name__ == "__main__":
    pg.init()
    pg.key.set_repeat(5, 5)
    SURFACE = pg.display.set_mode((800, 600))
    FPS = pg.time.Clock()
    SYSFONT = pg.font.SysFont(None, 36)   # I have to comment out this line

    main()

1 Ответ

1 голос
/ 20 февраля 2020

Я сам нашел решение
проблема в Нет в pygame.font.SysFont(None, 36, bold=True)
pyinstaller не смог найти системный шрифт по умолчанию в pygame
, поэтому я указал свой тип шрифта как Calibri и Это хорошо работает после этого

...