【问题标题】:RuntimeError: main thread is not in main loop when setting y coordinate on TimerRuntimeError:在 Timer 上设置 y 坐标时,主线程不在主循环中
【发布时间】:2021-11-23 00:58:40
【问题描述】:

我儿子向我展示了他用 python 编写的一些代码(他正在通过示例学习,并且正在开发一个基本的块弹跳应用程序)。

他让我在他的游戏中添加“重力”,所以我添加了一个 2 秒计时器,在按下“空格”后将 y 坐标重置为 0。

执行时我收到“主线程不在主循环中”错误消息,并且我阅读了一些线程,这些线程解释了我正在使用的计时器可能不在正确的线程上。我不确定如何实现排队,想知道是否有更简单的解决方案。

谢谢!

import turtle
from threading import Timer

wn = turtle.Screen()
wn.title("my game")
wn.bgcolor("blue")
wn.setup(width=1000, height=800)
wn.tracer(0)

#person
person = turtle.Turtle()
person.speed(0)
person.shape("square")
person.color("white")
person.shapesize(stretch_wid=1, stretch_len=1)
person.penup()
person.goto(-350, 0)

def personXX():
    x = person.xcor()
    x += 20
    person.setx(x)

def personXY():
    x = person.xcor()
    x -= 20
    person.setx(x)

def personYY():
    y = person.ycor()
    y += 20
    person.sety(y)

    r = Timer(2.0, fallToFloor )
  
    r.start()

def fallToFloor():
    y = person.ycor()
    y -= 20
    person.sety(y) 



    

wn.listen()
wn.onkeypress(personXY, "a")
wn.onkeypress(personXX, "d")
wn.onkeypress(personYY, "space")

while 1 == 1  :
    wn.update()

【问题讨论】:

    标签: python python-turtle


    【解决方案1】:

    在turtle/tkinter 中使用线程是很棘手的,因为图形命令只能从主线程调用。可以这样做,但这个程序并不真正需要,因为我们可以使用 turtle 自己的 'ontimer()` 事件来实现所需的结果:

    from turtle import Screen, Turtle
    
    def person_forward():
        person.forward(20)
    
    def person_backward():
        person.backward(20)
    
    def fallToFloor():
        person.sety(person.ycor() - 20)
    
    def person_jump():
        person.sety(person.ycor() + 20)
    
        screen.ontimer(fallToFloor, 2000)  # milliseconds
    
    screen = Screen()
    screen.title("My Game")
    screen.bgcolor('blue')
    screen.setup(width=1000, height=800)
    
    person = Turtle()
    person.shape('square')
    person.shapesize(stretch_wid=1, stretch_len=1)
    person.color('white')
    person.speed('fastest')
    person.penup()
    person.setx(-350)
    
    screen.onkeypress(person_forward, 'd')
    screen.onkeypress(person_backward, 'a')
    screen.onkeypress(person_jump, 'space')
    screen.listen()
    
    screen.mainloop()
    

    【讨论】:

      猜你喜欢
      • 2013-01-19
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 2022-06-16
      相关资源
      最近更新 更多