Python 海龟图形暂停/恢复功能上的随机行走

Python 海龟图形暂停/恢复功能上的随机行走,python,turtle-graphics,Python,Turtle Graphics,这里是菜鸟! 我修改了一个在线课程中的随机行走作业,我正在尝试创建一个函数,该函数将暂停程序,当再次调用时将恢复程序。 它目前暂停,但我似乎无法让它恢复;或者准确地说,一旦暂停,我就无法得到任何反应——就好像屏幕停止监听事件一样 我已经试过了: 为resume创建一个单独的函数-如果我在暂停前调用该函数,该函数会工作,但在暂停后,我无法调用它 我可以为if-go条件添加一个else子句,其中我将一个变量声明为screen.textinput,根据输入,程序将继续或结束,但我希望它像暂停一样简单

这里是菜鸟! 我修改了一个在线课程中的随机行走作业,我正在尝试创建一个函数,该函数将暂停程序,当再次调用时将恢复程序。 它目前暂停,但我似乎无法让它恢复;或者准确地说,一旦暂停,我就无法得到任何反应——就好像屏幕停止监听事件一样

我已经试过了:

  • 为resume创建一个单独的函数-如果我在暂停前调用该函数,该函数会工作,但在暂停后,我无法调用它
  • 我可以为if-go条件添加一个else子句,其中我将一个变量声明为screen.textinput,根据输入,程序将继续或结束,但我希望它像暂停一样简单
  • 我尝试在if go中断后作为else子句添加screen.listen()调用,但似乎不起作用
  • 我尝试将go=False设置为默认值,然后通过调用函数将其设置为True来启动它,但这也不起作用
附言: 我是编程新手,如果您有进一步的意见和建议,我将不胜感激

非常感谢

在相关行中附加我的代码和注释:

from turtle import Turtle, colormode, Screen
from random import choice, randint

colormode(255)
tim = Turtle('circle')
tim.speed('fastest')
tim.width(10)
screen = Screen()
go = True  # Boolean to initialize line 31


def pause():  # Currently it pauses, but doesn't resume.
    """Pause the program by setting go to False, and resume it if it was paused"""
    global go
    if go:
        go = False
    else:
        go = True


def random_color():
    """Return a random color"""
    r = randint(0, 255)
    g = randint(0, 255)
    b = randint(0, 255)
    generated_color = (r, g, b)
    return generated_color


screen.listen()  # Starts listening for events
screen.onkey(fun=pause, key='p')  # Event - when the 'p' key is pressed, the 'pause' function is called.

while True:  # Outer loop to prevent the code from ending when 'go' is set to False by pressing 'p' the first time
    if go:  # As default is True, after pausing can't restart it...
        if 200 > tim.xcor() > -200 and 200 > tim.ycor() > -200:
            tim.color(random_color())
            tim.forward(choice(range(50)))
            tim.setheading(choice(range(360)))
        else:
            tim.goto(0, 0)

问题是,在您的实现中,当
go
False
时,没有运行函数来获取键盘事件(因为您没有运行主事件循环)。一种非优雅的修复方法是在
go==False
时添加一个虚拟操作。将最终循环更改为:

while True:#外部循环,防止在第一次按“p”将“go”设置为False时结束代码
如果go:#默认为True,暂停后无法重新启动。。。
如果200>tim.xcor()>-200和200>tim.ycor()>-200:
tim.color(random_color())
前进时间(选择范围(50)))
定时设置标题(选择范围(360)))
其他:
后藤(0,0)
其他:
tim.setheading(0)
它会起作用的

另一种(更好的)方法是使用事件移动海龟。在下面的变体中,我使用
screen.ontimer
方法在给定时间后调用
move
函数。每次调用
move
,它都会重新安排自己在一段时间后运行(在本例中为50毫秒)。这样,您总是有一个事件循环运行并接收键盘事件

从海龟导入海龟,颜色模式,屏幕
来自随机导入选择,randint
颜色模式(255)
tim=海龟('圆圈')
提姆速度(“最快”)
限时宽度(10)
screen=screen()
go=True#用于初始化第31行的布尔值
def pause():#当前暂停,但不继续。
“”“通过将go设置为False来暂停程序,如果已暂停,则恢复程序”“”
全球围棋
如果开始:
go=错误
其他:
正确
def random_color():
“”“返回随机颜色”“”
r=randint(0255)
g=randint(0255)
b=randint(0255)
生成的颜色=(r,g,b)
返回生成的颜色
def move():
如果go:#默认为True,暂停后无法重新启动。。。
如果200>tim.xcor()>-200和200>tim.ycor()>-200:
tim.color(random_color())
前进时间(选择范围(50)))
定时设置标题(选择范围(360)))
其他:
后藤(0,0)
screen.ontimer(fun=move,t=50)#每0.05秒移动一次
screen.listen()#开始侦听事件
screen.onkey(fun=pause,key='p')#事件-当按下'p'键时,调用'pause'函数。
screen.ontimer(fun=move,t=0)#安排第一个动作
screen.mainloop()

捕捉得好。我尝试向循环的主体添加代码来跟踪程序流,但即使这样也无法尝试恢复。很酷的解决方案。了解了两者的工作原理,并将在未来实施。谢谢