2016-09-26 59 views
0

我希望能够暂停和思考此程序的每一步,并通过单击屏幕前进到下一步。最初我尝试添加一些事件,但随后我的大脑开始提醒我,这不是一个程序性程序,第一个绑定仍然是唯一的(!)。主要程序如下,非常感谢任何帮助。Python龟等待点击

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

回答

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的包​​装器方法。

+0

这很好 - 谢谢。请注意,了解QueuedTurtle课程将对我进行一些认真的研究。我将从修改队列开始,但是关于这些工作的更多信息将会有所帮助。例如,'_CFG'是指什么? – Robin

+0

@Robin,'__init__'方法的大部分都是从Turtle类复制而来的,这个类也是RawTurtle的子类 - 我尝试了继承Turtle,但是这个效果更好。这个方法的唯一补充就是'onclick'处理程序的设置。 '_CFG'的东西是从某种配置结构中获取信息并初始化乌龟,并且除了模拟乌龟外,它对QueuedTurtle的功能没有任何影响。 – cdlane