【问题标题】:Python Turtle Wait for ClickPython海龟等待点击
【发布时间】:2016-09-26 08:05:48
【问题描述】:

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

  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()

【问题讨论】:

    标签: python events recursion turtle-graphics


    【解决方案1】:

    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 生成包装方法。

    【讨论】:

    • 这很好 - 谢谢。请注意,了解 QueuedTurtle 课程对我来说需要认真学习。我将从修改队列开始,但任何有关其工作原理的进一步信息都会有所帮助。例如,_CFG 指的是什么?
    • @Robin,__init__ 方法的大部分是从 Turtle 类复制而来的,该类也是 RawTurtle 的子类——我尝试将 Turtle 子类化,但效果更好。此方法的唯一补充是 onclick 处理程序的设置。 _CFG 东西从某种配置结构中获取信息并初始化海龟,除了模拟海龟之外,它与 QueuedTurtle 的功能无关。
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多