python - turtle.onclick 滞后 1 个周期
问题描述
创建海龟 onclick 事件时,我的点击滞后 1 次点击。在我的示例中,我有两个按钮可以从一个值中加或减 1,当我单击其中一个按钮时,它会执行我按下的最后一个按钮的操作,而不是我刚刚单击的那个按钮。
例子:
我的号码是 3。
- 启动程序。
单击“+”-> 没有任何反应。
点击“+” -> 数字变为 4。
点击“-”->数字变为5。
单击空白处->数字变为4。
单击“+”-> 没有任何反应。
单击空白处->数字变为5。
示例代码。
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 次,我该如何解决?
解决方案
我无法重现您描述的错误行为。无论如何,这里有一些需要考虑的可能性:
在某些系统上,turtle 窗口不会作为关键窗口出现,您需要单击一次(在任何地方)以使其接收事件。您应该能够在海龟窗口和屏幕上的另一个窗口之间单击,以查看窗口在获得和失去关键状态时的视觉变化。如果您的窗口需要先被点击才能接收事件,那么您可能会将点击误算为按钮点击。
您的事件处理程序在处理前一个事件时打开以接收新事件。它们应该被禁用,直到它们为新事件做好准备,以防止事件相互干扰并弄乱您的计数。
您指示乌龟窗口处理
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()
推荐阅读
- git - git - 合并冲突
- javascript - 使用点分隔符对字符串数组编号的数组进行排序
- android - Unity.UnityContainer+Context 类型的 VTable 设置失败
- android - Android Studio Canary 卡在启动画面上
- r - r- grepl 以任何顺序查找匹配的字符串
- android - AsyncTask 中的画布
- tensorflow - 卷积层滤波器大小如何影响输入长度以及如何保持标签大小相同
- java - 为什么 Spring 要求枚举参数的名称与字符串值相同?
- haskell - 树的折叠列表 - hasekell
- .net - 对于受 Azure AD 保护的自定义 api,我们如何使用 AzureServiceTokenProvider 获取 AccessToken?