我希望能够暂停并考虑此计划的每一步,然后点击屏幕继续下一步。最初我尝试添加一堆事件,但后来我的大脑开始提醒我,这不是一个程序性程序,第一个绑定仍然是唯一的(!)。以下主要计划,任何帮助非常感谢。
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()
答案 0 :(得分: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生成包装器方法。