首页 > 解决方案 > turtle.onclick 滞后 1 个周期

问题描述

创建海龟 onclick 事件时,我的点击滞后 1 次点击。在我的示例中,我有两个按钮可以从一个值中加或减 1,当我单击其中一个按钮时,它会执行我按下的最后一个按钮的操作,而不是我刚刚单击的那个按钮。

例子:

我的号码是 3。

示例代码。

import turtle
num = 3

turtle.setup(400,500)
wn = turtle.Screen()
wn.title("None")
wn.bgcolor("black")


# Functions for what happens clicking the minus or plus button
def num_minus(xcor, ycor):
  global num
  if num > 1:
    num = num-1
  num_disp.clear()
  num_disp.write("{}".format(num), align="center", font=("Arial", 26, "normal"))
  print(num)

def num_plus(xcor, ycor):
  global num
  if num < 9:
    num = num+1
  num_disp.clear()
  num_disp.write("{}".format(num), align="center", font=("Arial", 26, "normal"))
  print(num)

# Creating minus button, left of number
minus_btn = turtle.Turtle()
minus_btn.penup()
minus_btn.color("gray")
minus_btn.shape("square")
minus_btn.goto(-30, 0)
minus_btn.onclick(num_minus)

# Creatig plus button, right of number
plus_btn = turtle.Turtle()
plus_btn.penup()
plus_btn.color("gray")
plus_btn.shape("square")
plus_btn.goto(30, 0)
plus_btn.onclick(num_plus)

# Displays the number
num_disp = turtle.Turtle()
num_disp.penup()
num_disp.color("red")
num_disp.goto(0, -20)
num_disp.write("{}".format(num), align="center", font=("Arial", 26, "normal"))
num_disp.ht()

wn.listen()
wn.mainloop()

为什么我的点击次数落后 1 次,我该如何解决?

标签: pythononclickturtle-graphics

解决方案


无法重现您描述的错误行为。无论如何,这里有一些需要考虑的可能性:

  1. 在某些系统上,turtle 窗口不会作为关键窗口出现,您需要单击一次(在任何地方)以使其接收事件。您应该能够在海龟窗口和屏幕上的另一个窗口之间单击,以查看窗口在获得和失去关键状态时的视觉变化。如果您的窗口需要先被点击才能接收事件,那么您可能会将点击误算为按钮点击。

  2. 您的事件处理程序在处理前一个事件时打开以接收新事件。它们应该被禁用,直到它们为新事件做好准备,以防止事件相互干扰并弄乱您的计数。

  3. 您指示乌龟窗口处理listen()此界面中未使用的键盘事件,因此不要打开它。

下面是我对您的代码的修改,以解决上述一些问题并重新设计它——看看它是否解决了您的任何问题:

from turtle import Screen, Turtle

FONT_SIZE = 26
FONT = ('Arial', FONT_SIZE, 'normal')

number = 3

# Functions for what happens when clicking the minus or plus button
def number_minus(x, y):
    global number

    minus_button.onclick(None)  # disable handler inside handler

    if number > 1:
        number -= 1

        number_display.clear()
        number_display.write(number, align='center', font=FONT)

    minus_button.onclick(number_minus)  # reenable handler on exit

def number_plus(x, y):
    global number

    plus_button.onclick(None)

    if number < 9:
        number += 1

        number_display.clear()
        number_display.write(number, align='center', font=FONT)

    plus_button.onclick(number_plus)

screen = Screen()
screen.setup(400, 500)
screen.bgcolor('black')

# Displays the number
number_display = Turtle()
number_display.hideturtle()
number_display.color('red')
number_display.penup()
number_display.sety(-FONT_SIZE/2)
number_display.write(number, align='center', font=FONT)

# Creating minus button, left of number
minus_button = Turtle()
minus_button.shape('triangle')
minus_button.color('gray')
minus_button.left(30)
minus_button.penup()
minus_button.setx(-30)
minus_button.onclick(number_minus)

# Creatig plus button, right of number
plus_button = Turtle()
plus_button.shape('triangle')
plus_button.color('gray')
plus_button.right(30)
plus_button.penup()
plus_button.setx(30)
plus_button.onclick(number_plus)

screen.mainloop()

推荐阅读