如何在 Python 中正确编写 .onclick()?

How to properly write an .onclick() in Python?

我正在尝试创建一个每次单击按钮时都会更新的计数器。 (这是我的第一个solo程序。)我写的.onclick()函数好像有问题,我不确定哪里出了问题。

这是我的代码供参考。 . .

感谢您的帮助。

import turtle

wn = turtle.Screen()
wn.title("Button Counting")
wn.bgcolor("red")
wn.setup(width=800, height=600)
wn.tracer(0)

written = 0

def click(x, y):
    wn.update()
    x = 0
    y = 0
    written += 1
    pen.clear()
    pen.write(" {} ".format(written), align="center")

button = turtle.Turtle()
button.penup()
button.color("white")
button.shape("square")
button.shapesize(stretch_wid=5, stretch_len=5)
button.onclick(click)

pen = turtle.Turtle()
pen.speed(0)
pen.color("black")
pen.penup()
pen.hideturtle()
pen.goto(0, 0)
pen.write(" 0 ")

解释在下面。 这是一个解决方案:

import turtle

written=0

wn=turtle.Screen()
wn.title("Button Counting")
wn.bgcolor("red")
wn.setup(width=800,height=800)

button=turtle.Turtle()
button.penup()
button.color("white")
button.shape("square")
button.shapesize(stretch_wid=5, stretch_len=5)

pen = turtle.Turtle()
pen.speed(0)
pen.color("black")
pen.penup()
pen.hideturtle()
pen.goto(0, 0)
pen.write(" 0 ")

def click(x,y):
    global written
    wn.update()
    written += 1
    x=0
    y=0
    pen.clear()
    pen.write(" {} ".format(written), align="center")

turtle.listen()
button.onclick(click)
turtle.mainloop()

当使用turtle.onkey/turtle.onclick等时,你需要让海龟先听turtle.listen()然后你添加button.onclick(click)然后turtle.mainloop()因为如果你不添加它,程序会立即停止。 我所做的更改是删除 wd.tracer(0) 因为那样它会隐藏添加 turtle.listen() button.onclick(click) turtle.mainloop() 和添加 global written 到定义 click 的“按钮”,因为您正在更改 [= 的值20=] 在定义中。如果您有任何问题,请提问!

我同意@JonathanDrukker 的观点,两个关键问题是您滥用了 tracer()update(),这在该程序中甚至不需要,以及缺少的 global 声明written。然而,他关于 listen() 的最初问题是转移注意力,因为它只适用于击键,而不适用于鼠标点击。 mainloop() 的必要性取决于您的 Python 环境。

我会选择一个更简单的实现,因为向居中字符串添加空格几乎没有价值,并且 speed() 在这种情况下没有实际用处:

from turtle import Screen, Turtle

written = 0

def click(x, y):
    global written

    written += 1
    pen.clear()
    pen.write(written, align='center')

screen = Screen()
screen.setup(width=800, height=600)
screen.title("Button Counting")
screen.bgcolor('red')

button = Turtle()
button.shape('square')
button.shapesize(5)
button.color('white')
button.onclick(click)

pen = Turtle()
pen.hideturtle()
pen.write(written, align='center')

screen.mainloop()

但是,这个程序,就像您的原始示例和 Jonathan 的示例一样,是脆弱的,因为它在海龟可见的同一位置写入。如果海龟在顶部,对代码稍作更改可能会导致它停止工作。我会把笔移到 (100, 100) 这样的地方,这样它就不会在另一只乌龟的中间。