在python龟程序中混合事件

时间:2017-03-29 21:39:31

标签: python turtle-graphics

我正在尝试编写一个python龟程序,其行为类似于使用游戏循环的常规事件驱动程序。该程序尝试混合鼠标,键盘和计时器事件,如下所示。

我的问题是python似乎无法将onkey()事件与ontimer()循环混合在一起。运行时,程序将为乌龟设置动画,onclick()事件将起作用。在第一次点击鼠标之前,按键甚至都没有注册。然后,当按下键退出时,我在shell中获得了大量错误。 bye()方法似乎是以粗野的方式终止程序而不是优雅地关闭。

我认为我的命令顺序正确。

任何建议都将不胜感激!

import turtle

playGround = turtle.Screen()
playGround.screensize(800, 600, 'light blue')

bob = turtle.Turtle()
bob.color('red')
bob.pencolor('red')
bob.ht()

def teleport(x,y):
    bob.goto(x,y)

def quitThis():
    playGround.bye()

def moveAround():
   bob.fd(10)
   bob.rt(15)
   playGround.ontimer(moveAround,30)

playGround.onclick(teleport,btn=1)
playGround.onkey(quitThis,'q')

moveAround()

playGround.listen()
playGround.mainloop()

1 个答案:

答案 0 :(得分:0)

我在您的代码中看到的一个问题是,您需要在moveAround()期间保持teleport()不发生,否则您会看到令人困惑的视觉效果。我发现使用turtle可以帮助在事件处理器内部禁用事件处理程序并在出路时重新启用它。

我相信以下内容将使您的活动顺利进行,并允许所有活动在适当的时间点火。我添加了一个状态变量来帮助控制活动:

from turtle import Turtle, Screen

def teleport(x, y):
    global state

    playGround.onclick(None)  # disable handler inside handler

    if state == "running":
        state = "teleporting"
        bob.goto(x, y)
        state = "running"

    if state != "quitting":
        playGround.onclick(teleport)

def quitThis():
    global state

    state == "quitting"

    playGround.onkey(None, 'q')

    playGround.bye()

def moveAround():
    if state == "running":
        bob.fd(10)
        bob.rt(15)

    if state != "quitting":
        playGround.ontimer(moveAround, 30)

playGround = Screen()
playGround.screensize(800, 600, 'light blue')

bob = Turtle(visible=False)
bob.color('red')

playGround.onclick(teleport)
playGround.onkey(quitThis, 'q')
playGround.listen()

state = "running"

playGround.ontimer(moveAround, 100)

playGround.mainloop()
  

当按下键退出时,我得到一个很大的错误列表   贝壳。 bye()方法似乎终止了一个程序   野蛮的时尚

这是典型的乌龟。如果真的让您感到困扰,请参阅我对Turtle window exit errors问题的回答,找出一种可能的解决方案。