2017-04-23 46 views
0

是的,它看起来就像是一个重复的问题(已经问here),但是,我有一个pygame的应用程序,而不是一个控制台应用程序的问题。从IDLE或Python代码执行器(只需双击该文件:))启动时,它工作正常,但崩溃没有回溯。它只是不断地崩溃(看起来像它崩溃的绘图步骤,我不知道),我每次启动EXE的时间。该代码是在这里:的Python 3:cx_Freeze冻结工作程序转换成不工作程序

import pygame 

# Define some colors 
BLACK = ( 0, 0, 0) 
WHITE = (255, 255, 255) 

# This is a simple class that will help us print to the screen 
# It has nothing to do with the joysticks, just outputing the 
# information. 
class TextPrint: 
    def __init__(self): 
     self.reset() 
     self.font = pygame.font.Font(None, 20) 

    def print(self, screen, textString): 
     textBitmap = self.font.render(textString, True, BLACK) 
     screen.blit(textBitmap, [self.x, self.y]) 
     self.y += self.line_height 

    def reset(self): 
     self.x = 10 
     self.y = 10 
     self.line_height = 15 

    def indent(self): 
     self.x += 10 

    def unindent(self): 
     self.x -= 10 


pygame.init() 

# Set the width and height of the screen [width,height] 
size = [500, 700] 
screen = pygame.display.set_mode(size) 

pygame.display.set_caption("JoyMonitor V.1.1") 
#pygame.display.set_icon("icon.ico") 
# Get ready to print 
textPrint = TextPrint() 

#Loop until the user clicks the close button. 
nondone = True 

# Used to manage how fast the screen updates 
clock = pygame.time.Clock() 

# Initialize the joysticks 
pygame.joystick.init() 

# -------- Main Program Loop ----------- 
while nondone: 
    # EVENT PROCESSING STEP 
    for event in pygame.event.get(): # User did something 
     if event.type == pygame.QUIT: # If user clicked close 
      nondone = False # Flag that we are done so we exit this loop 

     # Possible joystick actions: JOYAXISMOTION JOYBALLMOTION JOYBUTTONDOWN JOYBUTTONUP JOYHATMOTION 
     if event.type == pygame.JOYBUTTONDOWN: 
      print("Joystick button pressed.") 
     if event.type == pygame.JOYBUTTONUP: 
      print("Joystick button released.") 


    # DRAWING STEP 
    # First, clear the screen to white. Don't put other drawing commands 
    # above this, or they will be erased with this command. 
    screen.fill(WHITE) 
    textPrint.reset() 
    textPrint.print(screen, "JoyMonitor: Joysticks, Gamepads & Steering Wheels") 
    textPrint.print(screen, "Connecting/disconnecting devices requires restart!") 
    # Get count of joysticks 
    joystick_count = pygame.joystick.get_count() 

    textPrint.print(screen, "Number of game input devices: {}".format(joystick_count)) 
    textPrint.indent() 

    # For each joystick: 
    for i in range(joystick_count): 
     joystick = pygame.joystick.Joystick(i) 
     joystick.init() 
     textPrint.print(screen, "Device {}".format(i)) 
     textPrint.indent() 

     # Get the name from the OS for the controller/joystick 
     name = joystick.get_name() 
     textPrint.print(screen, "Device name: {}".format(name)) 

     # Usually axis run in pairs, up/down for one, and left/right for 
     # the other. 
     axes = joystick.get_numaxes() 
     textPrint.print(screen, "Number of axes: {}".format(axes)) 
     textPrint.indent() 

     for i in range(axes): 
      axis = joystick.get_axis(i) 
      textPrint.print(screen, "Axis {} value: {:>6.3f}".format(i, axis)) 
     textPrint.unindent() 

     buttons = joystick.get_numbuttons() 
     textPrint.print(screen, "Number of buttons: {}".format(buttons)) 
     textPrint.indent() 

     for i in range(buttons): 
      button = joystick.get_button(i) 
      textPrint.print(screen, "Button {:>2} value: {}".format(i,button)) 
     textPrint.unindent() 

     # Hat switch. All or nothing for direction, not like joysticks. 
     # Value comes back in an array. 
     hats = joystick.get_numhats() 
     textPrint.print(screen, "Number of POVs: {}".format(hats)) 
     textPrint.indent() 

     for i in range(hats): 
      hat = joystick.get_hat(i) 
      textPrint.print(screen, "POV {} value: {}".format(i, str(hat))) 
     textPrint.unindent() 

     balls = joystick.get_numballs() 
     textPrint.print(screen, "Number of trackballs: {}".format(balls)) 
     textPrint.indent() 

     for i in range(balls): 
      ball = joystick.get_ball(i) 
      textPrint.print(screen, "Trackball {} value: {}".format(i, str(ball))) 
     textPrint.unindent() 
     textPrint.unindent() 


    # ALL CODE TO DRAW SHOULD GO ABOVE THIS COMMENT 

    # Go ahead and update the screen with what we've drawn. 
    pygame.display.flip() 

    # Limit to 60 frames per second 
    clock.tick(60) 

# Close the window and quit. 
# If you forget this line, the program will 'hang' 
# on exit if running from IDLE. 
pygame.quit() 
+1

你可以添加你的'setup.py'吗? – Dashadower

回答

1

Making an .exe for pygame with cx-freeze,你需要使用,如果你不打算包括pygame.font.Font(None,20) 一个解决方案的默认字体的系统字体替换:

self.font = pygame.font.Font(None, 20) 

到:

self.font = pygame.font.SysFont("arial", 20) #or you can use any other system font 

或者,也可以包括默认的TTF文件字体在你的setup.py,你可以使用pygame.font.get_defaultfont()