【问题标题】:How to properly write an .onclick() in Python?如何在 Python 中正确编写 .onclick()?
【发布时间】:2021-05-18 03:09:32
【问题描述】:

我正在尝试创建一个每次单击按钮时都会更新的计数器。 (这是我的第一个单独程序。)我写的 .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 ")

【问题讨论】:

    标签: python python-3.x onclick python-turtle


    【解决方案1】:

    解释如下。 这是一种解决方案:

    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.onclicketc 时,你需要让乌龟先听turtle.listen(),然后你添加button.onclick(click)然后turtle.mainloop(),因为如果你不添加它,程序会立即停止。 我所做的更改是删除wd.tracer(0),因为它会隐藏添加turtle.listen() button.onclick(click) turtle.mainloop() 并将global written 添加到定义click 的“按钮”,因为您正在更改定义中written 的值。如果您有任何问题都可以问!

    【讨论】:

    • 在这种情况下,您对listen() 的使用和解释是虚假的。它用于击键,而不是鼠标单击。另请注意,当您的代码运行时,pen.write(" 0 ") 永远不会出现。
    【解决方案2】:

    我同意@JonathanDrukker 的观点,即两个关键问题是您对tracer()update() 的滥用,这在此程序中甚至都不需要,以及written 缺少global 声明。然而,他对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) 这样的地方,这样它就不会在另一只乌龟的中间。

    【讨论】:

      猜你喜欢
      • 2018-01-10
      • 1970-01-01
      • 2019-12-09
      • 2022-07-07
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 2020-04-10
      • 2021-04-09
      相关资源
      最近更新 更多