2016-09-26 87 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