Python Turtle库中点击触发游戏启动后窗口意外关闭的问题求助
Hey there! Let's fix this issue you're having with your turtle game. The main problems are conflicting click events and how your game loop interacts with the initial is_game_on state. Let's break it down and get your game working as intended:
What's Causing the Problem?
- Premature Exit: When you set
is_game_on = Falseinitially, your code skips the while loop entirely and immediately hitsscreen.exitonclick(). This means any click (including your "Click to Start" area) will trigger the window to close right away—your custom click handler never gets a chance to run. - Conflicting Click Handlers:
screen.exitonclick()is designed to wait for a single click then exit, which clashes with your ownscreen.onclick(click)that's supposed to start the game. - Blocking Event Loop: The while loop blocks Turtle's built-in event handling, which can make interactions feel unresponsive even when the game is running.
Fixed Code with Explanations
Here's a revised version of your code that addresses all these issues, plus some quality-of-life tweaks:
from turtle import Screen, Turtle import time # Start with the game off, showing the static interface is_game_on = False def start_game(x, y): global is_game_on # Adjust the click area to match the "Click to Start" text bounds if 200 <= x <= 500 and 280 <= y <= 320: is_game_on = True start.clear() # Hide the start text once clicked print("Game started!") game_loop() # Launch the game loop class Ball(Turtle): def __init__(self): super().__init__() self.shape('circle') self.color('black') self.shapesize(stretch_wid=2, stretch_len=2) self.penup() self.goto(0, -355) self.x_move = 0 self.y_move = 1 self.move_speed = 0.01 # Use a time interval for smoother movement def move(self): new_x = self.xcor() + self.x_move new_y = self.ycor() + self.y_move self.goto(new_x, new_y) def bounce_y(self): self.y_move *= -1 class Paddle(Turtle): def __init__(self): super().__init__() self.shape('square') self.penup() self.goto(0, -380) self.color('blue') self.shapesize(stretch_wid=.5, stretch_len=10) def move(self, x, y): # Keep the paddle within screen bounds if -550 <= x <= 550: self.goto(x, -380) class Start(Turtle): def __init__(self): super().__init__() self.penup() self.goto(350, 300) # Center the text in the upper-right area self.color('blue') self.hideturtle() self.write('Click to Start', align="center", font=('Arial', 35, 'bold')) def game_loop(): if is_game_on: time.sleep(ball.move_speed) screen.update() ball.move() # Bounce off the top screen edge if ball.ycor() >= 375: ball.bounce_y() # Bounce off the paddle (adjusted collision check for accuracy) if abs(ball.xcor() - paddle.xcor()) < 120 and abs(ball.ycor() + 355) < 5: ball.bounce_y() # Repeat the loop to keep the game running screen.ontimer(game_loop, 10) else: # Check for game start periodically when idle screen.ontimer(game_loop, 50) # Set up the screen screen = Screen() screen.colormode(255) screen.bgcolor('white') screen.setup(1200, 800) screen.tracer(0) # Create game objects paddle = Paddle() ball = Ball() start = Start() # Bind interactions screen.listen() paddle.ondrag(paddle.move) screen.onclick(start_game) # Initial screen update to show the start text screen.update() # Keep the window open and handle events until manually closed screen.mainloop()
Key Changes Explained:
- Replaced
screen.exitonclick()withscreen.mainloop():mainloop()keeps the window open and processes all events (like clicks and drags) until you manually close the window—no more accidental exits. - Switched to
ontimer()for the game loop: This recursive approach avoids blocking Turtle's event handler, so clicks and drags feel responsive even when the game is running. When the game is off, it checks periodically for the start signal. - Improved click area accuracy: Adjusted the coordinate range to match the actual bounds of the "Click to Start" text, and cleared the text once the game starts for a cleaner interface.
- Added paddle bounds: Prevents the paddle from being dragged outside the screen.
- Smoother ball movement: Changed
move_speedto a time interval instead of a fixed value for more natural movement.
Now your game will start with a static "Click to Start" screen. Click that area, the text will disappear, and the ball will begin bouncing—all without the window closing unexpectedly!
内容的提问来源于stack exchange,提问作者Srinivas
相关产品推荐
相关产品推荐

