Ozgu Turgut
Ozgu Turgut

Reputation: 133

Pygame Executable Crashing

I have a small animation code that is built using PyGame (and Python 2.7). I am able to build the executable folder with Pyinstaller, however when I try to run the executable it is crashing, although I am able to run the same files (i.e. source code) through my terminal without any problem.

import pygame
import exercise
import random as rd
import copy
import pandas as pd
import numpy as np


def animate():
    debug_mode=False

    done1 = False

    dc_x = 30
    dc_y = 30
    plant_x = 110
    plant_y = 30
    supp_x = 190
    supp_y = 30

    WHITE = (255, 255, 255)
    BLACK = (0, 0, 0) #arrows
    RED = (255, 0, 0) # Box frames for summary of t, cost and lost sales
    GREEN = (0, 255, 0) # Box frames for shipment amounts
    DEEPSKYBLUE = (0,191,255)  # arc to represent backup WIP inv
    DOGERBLUE = (0,191,255)  # arc to represent backup FG inv
    INDIGO = (75,0,130)  # DC/Supp up state
    LAVENDER=(238, 130, 238) #DC/Supp down state
    OLIVE=(128,128,0) #plant down state
    YELLOWGREEN=(173,255,47) #plant up state
    DARKYELLOW=(204,204,0)

    pygame.init()
    screen = pygame.display.set_mode((1000, 600))

    clock = pygame.time.Clock()
    grand_record={}
    ############ READ AND PREPARE INITIAL SCREEN for t==0 ################
    PLANT_status, SUPP_status, DC_status, disruption, DC_BUp_Plan, Plant_BUp_Plan, Supp_BUp_Plan, Demand, P=exercise.init(debug_mode,False)
    grand_record[0]={"DC":DC_status, "Plant":PLANT_status, "Supplier":SUPP_status}

    basicFont = pygame.font.SysFont(None, 24)
    largeFont = pygame.font.SysFont(None, 35)
    pygame.display.set_caption('SCREAM!')
    if debug_mode: R=1
    else: R= rd.randint(0,25)
    scenario_score={"cost":0, "service":0}


    while not done1:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                done1 = True
            #if event.type == pygame.KEYDOWN:
            #    if event.key == pygame.K_DOWN:
            #        paused()
        end_of_one_run=1
        total_lost_customer=0
        cumulative_inv_holding_cost=0
        total_fixed_cost_paid=0
        table_output=[]
        chart_output=[]
        header=["Week","Demand","Upstream shipment", "Shipment from regular DC", "Shipment from backup DC",
                "FG Inv at Reg. DC", "FG Inv at B/up. DC", "FG Inv as B/up","LostSales","Start Order for b/up DC", "B/up DC starts","DC Disruption at","Disruption duration", "TotalAvailableWIPSupplyCap",
                "Start Order for b/up Supplier", "B/up Supplier starts","Supplier Disruption at","Disruption duration", "Storage Cap Available", "Plant production",
                 "WIP Inv as B/up","Start Order for b/up Plant", "B/up Plant starts","Plant Disruption at","Disruption duration"]
        table_output.append(header)
        for t in range(1,P+1): # for the specified number of periods
            screen.fill((0, 0, 0))
            picture = pygame.image.load('Background.png').convert() #MITwallpaper
            screen.blit(picture, [0, 0])
            #import pdb; pdb.set_trace()
            ################################## MAKE CALCULATIONS FOR t>0 ################
            grand_record,output=exercise.calculate(t, grand_record[t-1]["Plant"], grand_record[t-1]["Supplier"], grand_record[t-1]["DC"], disruption, DC_BUp_Plan, Plant_BUp_Plan,  Supp_BUp_Plan,Demand[R*P+t],grand_record,debug_mode)
            chart_output=exercise.prepare_chart_output(chart_output, grand_record)
            output_loc=copy.deepcopy(output)
            table_output.append(output_loc)
            end_of_one_run=end_of_one_run+1

            objectives=exercise.calculate_objectives(grand_record, DC_BUp_Plan, Plant_BUp_Plan, Supp_BUp_Plan, t)

            lost_cust_text = largeFont.render("Service: "+str(objectives["Service"]), True, WHITE, BLACK)
            lost_cust_textRect = lost_cust_text.get_rect()
            lost_cust_textRect.centerx = 380
            lost_cust_textRect.centery = 420
            pygame.draw.rect(screen, RED, (lost_cust_textRect.left - 3, lost_cust_textRect.top - 3, lost_cust_textRect.width + 3, lost_cust_textRect.height + 3))
            screen.blit(lost_cust_text, lost_cust_textRect)
            inv_hold_text = largeFont.render("Inv.Holding Cost(k$): "+str(round(objectives["InvHoldingCost"]*0.001,1)), True, WHITE, BLACK)
            inv_hold_textRect = inv_hold_text.get_rect()
            inv_hold_textRect.centerx = 600
            inv_hold_textRect.centery = 445
            pygame.draw.rect(screen, RED, (inv_hold_textRect.left - 3, inv_hold_textRect.top - 3, inv_hold_textRect.width + 3, inv_hold_textRect.height + 3))
            screen.blit(inv_hold_text, inv_hold_textRect)
            startup_text = largeFont.render("Startup Cost(k$): "+str(round(objectives["Startup_cost"]*0.001,1)), True, WHITE, BLACK)
            startup_textRect = startup_text.get_rect()
            startup_textRect.centerx = 840
            startup_textRect.centery = 470
            pygame.draw.rect(screen, RED, (startup_textRect.left - 3, startup_textRect.top - 3, startup_textRect.width + 3, startup_textRect.height + 3))
            screen.blit(startup_text, startup_textRect)

            ###################################################################################
            if t<P:
                pygame.display.flip()
                clock.tick(8)
            else:
                #import pdb; pdb.set_trace()
                table = pd.DataFrame(table_output)
                table.to_excel("Details.xlsx",index=False)

        #import pdb; pdb.set_trace()
        done1 = True
    ################################ Want A PARETO Button     ###################################
    x=500
    y=500
    w=200
    h=50
    pygame.draw.rect(screen, DEEPSKYBLUE,(x,y,w,h))
    buttontext = basicFont.render("Want A Pareto Solution?", True, BLACK , WHITE )
    buttontext_rect=buttontext.get_rect()
    buttontext_rect.centerx = (x+(w/2))
    buttontext_rect.centery = (y+(h/2))
    screen.blit(buttontext, buttontext_rect)
    pygame.display.flip()
    pygame.time.delay(120)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()

    exercise.plotcharts(chart_output)
################################################################################
animate()

Upvotes: 0

Views: 1389

Answers (2)

ABot
ABot

Reputation: 197

I had the same problem (also Python 2.7), and this did it for me:

pyinstaller usually has trouble with pygame.font.SysFont("some_font", 24)

Instead use pygame.font.Font("your_own_font.ttf", 24). Download a font and either put it in the same folder as your file, or in a data folder. I use VeraMono and put it in a data folder, so my code would be

...
basicFont = pygame.font.Font("data/VeraMono", 24)
largeFont = pygame.font.Font("data/VeraMono", 35)
pygame.display.set_caption('SCREAM!')
...

If you don't have a data/ folder added to your project yet, then add the following lines to your spec file (the spec file is created as soon as you run you pyinstaller the first time. It has the same name as your python file.)

# -*- mode: python -*-

block_cipher = None

# This entry is new!
added_files = [
    ( 'data', 'data'),
    ]

a = Analysis(['CleanTest.py'],
         pathex=['/home/angela/Desktop/Arbeit/VisualTest'],
         binaries=[],
         datas=added_files,   # add the new file to your data tree
         hiddenimports=[],
         hookspath=[],
         runtime_hooks=[],
         excludes=[],
         win_no_prefer_redirects=False,
         win_private_assemblies=False,
         cipher=block_cipher)
...

Run pyinstaller <your_file>.spec, and hopefully it'll work.

Upvotes: 2

The4thIceman
The4thIceman

Reputation: 3889

my guess is that it crashes when trying to load the background image:

picture = pygame.image.load('Background.png').convert() #MITwallpaper

When pyinstaller compiles your code, that is all it compiles (including the imported dependencies). It creates the dist directory where you can run your executable and you are good to go.

But, by default, pyinstaller will not pull in external resources. So when you run the executable, it can't find your image because it is in a different directory. You can test this by manually copying the image to the folder where the exe is located and see if it works.

Also, you can run the exe and push the output into a debug file:

your_file.exe > debug.txt

This way you can capture the output from your program (including error messages).

Upvotes: 0

Related Questions