I made a "Game". I love playing it, and I would like to distribute it to my friends without having to install Python and Pygame on their computers.
I did a lot of research on Py2Exe and Pyinstaller. I looked through many tutorials, fixes, errors, but none of them seem to help me.
Pyinstaller is useless because it doesn't like fonts in Pygame, and Py2exe wouldn't compile the built in modules, so I found Pygame2exe which is just a premade setup script for use with py2exe that includes pygame and fonts. It supposedly builds fine, but the exe is unusable... I get the error:
"Microsoft Visual C++ Runtime Library
Runtime Error!
Program C:...\dist\Worm Game.exe
This application has requested the Runtime to terminate in an unusual way. Please contact the application's support team for more information."
I just don't get it... Why can't I compile this game!!!
Here is the game code, made with Python 2.7:
import pygame
import random
import os
pygame.init()
class Worm:
def __init__(self, surface):
self.surface = surface
self.x = surface.get_width() / 2
self.y = surface.get_height() / 2
self.length = 1
self.grow_to = 50
self.vx = 0
self.vy = -1
self.body = []
self.crashed = False
self.color = 255, 255, 0
def event(self, event):
if event.key == pygame.K_UP:
if self.vy != 1:
self.vx = 0
self.vy = -1
else:
a = 1
elif event.key == pygame.K_DOWN:
if self.vy != -1:
self.vx = 0
self.vy = 1
else:
a = 1
elif event.key == pygame.K_LEFT:
if self.vx != 1:
self.vx = -1
self.vy = 0
else:
a = 1
elif event.key == pygame.K_RIGHT:
if self.vx != -1:
self.vx = 1
self.vy = 0
else:
a = 1
def move(self):
self.x += self.vx
self.y += self.vy
if (self.x, self.y) in self.body:
self.crashed = True
self.body.insert(0, (self.x, self.y))
if (self.grow_to > self.length):
self.length += 1
if len(self.body) > self.length:
self.body.pop()
def draw(self):
x, y = self.body[0]
self.surface.set_at((x, y), self.color)
x, y = self.body[-1]
self.surface.set_at((x, y), (0, 0, 0))
def position(self):
return self.x, self.y
def eat(self):
self.grow_to += 25
class Food:
def __init__(self, surface):
self.surface = surface
self.x = random.randint(10, surface.get_width()-10)
self.y = random.randint(10, surface.get_height()-10)
self.color = 255, 255, 255
def draw(self):
pygame.draw.rect(self.surface, self.color, (self.x, self.y, 3, 3), 0)
def erase(self):
pygame.draw.rect(self.surface, (0, 0, 0), (self.x, self.y, 3, 3), 0)
def check(self, x, y):
if x < self.x or x > self.x +3:
return False
elif y < self.y or y > self.y +3:
return False
else:
return True
def position(self):
return self.x, self.y
font = pygame.font.Font(None, 25)
GameName = font.render("Worm Eats Dots", True, (255, 255, 0))
GameStart = font.render("Press Any Key to Play", True, (255, 255, 0))
w = 500
h = 500
screen = pygame.display.set_mode((w, h))
GameLoop = True
while GameLoop:
MenuLoop = True
while MenuLoop:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
elif event.type == pygame.KEYDOWN:
MenuLoop = False
screen.blit(GameName, (180, 100))
screen.blit(GameStart, (155, 225))
pygame.display.flip()
screen.fill((0, 0, 0))
clock = pygame.time.Clock()
score = 0
worm = Worm(screen)
food = Food(screen)
running = True
while running:
worm.move()
worm.draw()
food.draw()
if worm.crashed:
running = False
elif worm.x <= 0 or worm.x >= w-1:
running = False
elif worm.y <= 0 or worm.y >= h-1:
running = False
elif food.check(worm.x, worm.y):
score += 1
worm.eat()
print "Score %d" % score
food.erase()
food = Food(screen)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
elif event.type == pygame.KEYDOWN:
worm.event(event)
pygame.display.flip()
clock.tick(200)
if not os.path.exists("High Score.txt"):
fileObject = open("High Score.txt", "w+", 0)
highscore = 0
else:
fileObject = open("High Score.txt", "r+", 0)
fileObject.seek(0, 0)
highscore = int(fileObject.read(2))
if highscore > score:
a = 1
else:
fileObject.seek(0, 0)
if score < 10:
fileObject.write("0"+str(score))
else:
fileObject.write(str(score))
highscore = score
fileObject.close()
screen.fill((0, 0, 0))
ScoreBoarda = font.render(("You Scored: "+str(score)), True, (255, 255, 0))
if highscore == score:
ScoreBoardb = font.render("NEW HIGHSCORE!", True, (255, 255, 0))
newscore = 1
else:
ScoreBoardb = font.render(("High Score: "+str(highscore)), True, (255, 255, 0))
newscore = 0
Again = font.render("Again?", True, (255, 255, 0))
GameOver = font.render("Game Over!", True, (255, 255, 0))
screen.blit(GameName, (180, 100))
screen.blit(GameOver, (200, 137))
screen.blit(ScoreBoarda, (190, 205))
if newscore == 0:
screen.blit(ScoreBoardb, (190, 235))
elif newscore == 1:
screen.blit(ScoreBoardb, (175, 235))
screen.blit(Again, (220, 365))
pygame.draw.rect(screen, (0, 255, 0), (200, 400, 40, 40), 0)
pygame.draw.rect(screen, (255, 0, 0), (260, 400, 40, 40), 0)
LEFT = font.render("L", True, (0, 0, 0))
RIGHT = font.render("R", True, (0, 0, 0))
screen.blit(LEFT, (215, 415))
screen.blit(RIGHT, (275, 415))
pygame.display.flip()
loop = True
while loop:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
elif event.type == pygame.MOUSEBUTTONDOWN:
x, y = event.pos
if x > 200 and x < 240 and y > 400 and y < 440:
loop = False
elif x > 260 and x < 300 and y > 400 and y < 440:
GameLoop = False
loop = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
loop = False
elif event.key == pygame.K_RIGHT:
GameLoop = False
loop = False
screen.fill((0, 0, 0))
pygame.quit()
I met this problem, too. After investigation, I found that the runtime error is caused by the font. I noticed that you also used None as the font name, too. Please remember that there's a notice for using the pygame2exe about the font, just below "Changes by arit:" at pygame2exe page, that we should use a "fontname.ttf" to replace None and place that fontname.ttf under the correct folder that the exe can find. For example, you can use "freesansbold.ttf" to replace None when creating font, and place freesansbold.ttf under the folder the exe file exists. Hope that helps.
I do not think there is anything wrong with your code. Infact, it compiles well and I played as well. Nice game.
I would suggest looking into the following in your computer,
I think if the above two are properly in place, it should work fine.
I tested this on a machine with the following conf: 1. Windows 7 with all the security patches updated.
My answer:
After few weeks (had this problem even before) I'm happy to say that I solved this problem! :)
1st part of my problem (http://i.stack.imgur.com/WpkjR.png): I solved it by editing setup.py script with adding "excludes" part in it. That resulted in successful making of executable file!
Modified setup.py script:
from distutils.core import setup
import py2exe
setup(windows=['source_static.py'], options={
"py2exe": {
"excludes": ["OpenGL.GL", "Numeric", "copyreg", "itertools.imap", "numpy", "pkg_resources", "queue", "winreg", "pygame.SRCALPHA", "pygame.sdlmain_osx"],
}
}
)
So, if you have similar issues, just put those "missing" modules into this "excludes" line.
2nd part:
After I succeeded in making of executable file, I had next problem: "The application has requested the Runtime to terminate it in unusual way. Please contact...". After days and days of searching and thinking how to solve this another problem, I found a way to do it. I couldn't believe that the problem was so absurd. The problem was in my code, with font definition:
font1 = pygame.font.SysFont(None, 13)
After changing "None" to some system font name (for an example "Arial" (must be a string)), and compiling, I couldn't believe that my .exe file worked!
font1 = pygame.font.SysFont("Arial", 13)
Of course, you can use your own font, but you must specify its path and define it in your program.
So for all of you who are experiencing this issues, try this steps and I hope that you will succeed. I really hope that this will help you, because I've lost days and weeks trying to solve these problems. I even tried making my .exe file with all versions of python and pygame, with many other .exe builders and setup scripts, but without luck. Besides these problems, I had many other problems before but I found answers to them on stackoverflow.com.
I'm happy that I found a way to solve this problems and to help you if you are faced with the same ones.
Small tips (things I've also done):
1st: update your Microsoft Visual C++ library to the latest one.
2nd: if you have images or fonts similar that your executable program needs, include them to dist folder (where your .exe file has been created).
3rd: when you are making your .exe file, include all needed files to the folder where your setup.py script is (all files and directories that your main script uses).
Used Python 2.7 x64, pygame and py2exe.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With