Python 3:cx

系统教程 行业动态 更新时间:2024-06-14 16:58:30
Python 3:cx_Freeze将工作程序冻结为NOT工作程序(Python 3: cx_Freeze freezes a working program into a NOT working program)

是的,它看起来像是一个重复的问题(已经在这里问过 ),但是,我遇到了Pygame应用程序的问题,而不是控制台应用程序。 从IDLE或Python Code Executer启动它时工作正常(只需双击文件:)),但崩溃时没有回溯 。 每次启动EXE时,它都会不停地崩溃(看起来它在绘图步骤中崩溃,我不知道)。 完整代码在这里:

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 ()

Yes, it looks like it's a duplicate question (already asked here), however, I have a problem with a Pygame app, not a Console app. It works fine when launching it from IDLE or Python Code Executer (just double-clicking the file :) ), but crashes with no tracebacks. It just keeps crashing (looks like it crashes on the drawing step, I don't know) every time I launch the EXE. The full code is here:

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 ()

最满意答案

根据使用cx-freeze为pygame制作一个.exe ,你需要使用系统字体,如果你不打算包含pygame.font.Font(None,20)的默认字体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

或者,您可以在setup.py中包含默认Font字体的ttf文件,您可以使用pygame.font.get_defaultfont()获取该pygame.font.get_defaultfont()

According to Making an .exe for pygame with cx-freeze, you need to use a system font if you're not going to include the default font of pygame.font.Font(None,20) One solution is to replace:

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

to:

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

Or, you can include the ttf file of the default Font font in your setup.py, which you can get using pygame.font.get_defaultfont()

更多推荐

本文发布于:2023-04-15 03:39:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/dzcp/1c032208be8194815aba8bbd6c470ecc.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Python   cx

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!