2016-09-26 8 views
0

私はこのプログラムの各ステップを一時停止して熟考し、画面をクリックして次のステップに進むことができます。当初、私はたくさんのイベントを追加しようとしましたが、私の脳が蹴り込まれ、これは手続き型プログラムではなく、最初の拘束力が唯一のものになりました(!)。下のメインプログラム、どんな助けも大歓迎です。救助へのOOPについてPython Turtleがクリックを待つ

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

方法!私たちはタートルをサブクラス化して、実行するよう要求されたすべてのものをキューに入れます。

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

これはあなたの例のプログラムを動作させるために必要なだけのコードと部分的な実装です:その後、我々はそのキューから一つの項目をポップし、それを実行しonclick()ハンドラを設定します。それを実行し、マウスをクリックします。

QueuedTurtleのラッパーメソッドをプログラムで生成することもできます。

+0

それはすごくうれしいです - ありがとう。 QueuedTurtleクラスを理解することは私のためにいくつかの真剣な研究をするつもりです。キューを改訂することから始めますが、これがどのように機能するかについての詳細は参考になります。例えば、 '_CFG'は何を参照していますか? – Robin

+0

@Robin、 '__init__'メソッドの大部分がTurtleクラスからコピーされました.TurtleクラスはRawTurtleもサブクラス化しました。このメソッドへの唯一の追加は 'onclick'ハンドラの設定です。 '_CFG'は何らかの構成構造からの情報を受け取り、カメを初期化しています。タートルをエミュレートする以外はQueuedTurtleの機能には関係しません。 – cdlane

関連する問題