Python龟等待点击
问题描述:
我希望能够暂停和思考此程序的每一步,并通过单击屏幕前进到下一步。最初我尝试添加一些事件,但随后我的大脑开始提醒我,这不是一个程序性程序,第一个绑定仍然是唯一的(!)。主要程序如下,非常感谢任何帮助。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()
答
如何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
@Robin,'__init__'方法的大部分都是从Turtle类复制而来的,这个类也是RawTurtle的子类 - 我尝试了继承Turtle,但是这个效果更好。这个方法的唯一补充就是'onclick'处理程序的设置。 '_CFG'的东西是从某种配置结构中获取信息并初始化乌龟,并且除了模拟乌龟外,它对QueuedTurtle的功能没有任何影响。 – cdlane