Python 乌龟等待点击

Python Turtle Wait for Click

我希望能够暂停并思考这个程序的每一步,然后通过单击屏幕继续下一步。最初我尝试添加一堆事件,但随后我的大脑启动并提醒我这不是一个程序程序,第一个绑定将仍然是唯一的(!)。下面是主程序,非常感谢任何帮助。

  def tree(self, branchLen):
    if branchLen > 5:
      self.screen.onscreenclick(lambda x,y: self.t.forward(branchLen))
      self.screen.onscreenclick(lambda x,y: self.t.right(20))
      self.tree(branchLen-15)
      self.screen.onscreenclick(lambda x,y: self.t.left(40))
      self.tree(branchLen-15)
      self.screen.onscreenclick(lambda x,y: self.t.right(20))
      self.screen.onscreenclick(lambda x,y: self.t.backward(branchLen))

import turtle

class Tree(object):
  def __init__(self):
    self.t = turtle.Turtle()
    self.screen = turtle.Screen()

    self.t.left(90)
    self.t.up()
    self.t.backward(100)
    self.t.down()
    self.t.color("green")
    self.tree(75)

  def tree(self, branchLen):
    if branchLen > 5:
      self.t.forward(branchLen)
      self.t.right(20)
      self.tree(branchLen-15)
      self.t.left(40)
      self.tree(branchLen-15)
      self.t.right(20)
      self.t.backward(branchLen)

tree = Tree()

OOP 来帮忙怎么样!我们对 Turtle 进行子类化,使其能够将要求它做的所有事情排队。然后我们设置一个 onclick() 处理程序,从该队列中弹出一个项目并执行它:

import sys
import turtle

class QueuedTurtle(turtle.RawTurtle):

    _queue = []
    _pen = None
    _screen = None

    def __init__(self, shape=turtle._CFG["shape"], undobuffersize=turtle._CFG["undobuffersize"], visible=turtle._CFG["visible"]):

        if QueuedTurtle._screen is None:
            QueuedTurtle._screen = turtle.Screen()

        self._screen.onclick(lambda *args: self.queue_pop())

        turtle.RawTurtle.__init__(self, QueuedTurtle._screen, shape=shape, undobuffersize=undobuffersize, visible=visible)

    def queue_pop(self):
        if self._queue:
            function, arguments = self._queue.pop(0)
            return function(*arguments)

        print("Empty queue popped!", file=sys.stderr)

    def backward(self, *args):
        self._queue.append((super().backward, args))

    def forward(self, *args):
        self._queue.append((super().forward, args))

    def right(self, *args):
        self._queue.append((super().right, args))

    def left(self, *args):
        self._queue.append((super().left, args))

    def up(self, *args):
        self._queue.append((super().up, args))

    def down(self, *args):
        self._queue.append((super().down, args))

    def color(self, *args):
        self._queue.append((super().color, args))


class Tree(object):
    def __init__(self):
        self.t = QueuedTurtle()

        self.t.left(90)
        self.t.up()
        self.t.backward(100)
        self.t.down()
        self.t.color("green")
        self.tree(75)

    def tree(self, branchLen):
        if branchLen > 5:
            self.t.forward(branchLen)
            self.t.right(20)
            self.tree(branchLen - 15)
            self.t.left(40)
            self.tree(branchLen - 15)
            self.t.right(20)
            self.t.backward(branchLen)

tree = Tree()

tree.tree(10)

turtle.mainloop()

这是一个部分实现,其代码刚好足以让您的示例程序运行。 运行它,然后开始点击你的鼠标。

我们甚至可以通过编程方式为 QueuedTurtle 生成包装器方法。