Runtime Error: main thread is not in main loop: turtle graphics and python

Runtime Error: main thread is not in main loop: turtle graphics and python

我只是为了好玩而涂鸦,我想做的是每次单击时在鼠标上画一个圆圈设计。如果我将 if 中的内容更改为 print('hi') 之类的内容,它会做出反应,但如果我说 circles(x, y),它会显示“运行时错误:主线程不在主循环中”。 =12=]

代码:

from turtle import *
from pynput.mouse import Listener

t = Turtle()
t.hideturtle()
t.speed(0)

t.up()
t.goto(-500, -500)
t.down()
t.begin_fill()
t.color("black", "black")
for i in range(4):
    t.forward(1000)
    t.left(90)
t.end_fill()


def circles(x, y):
    t.up()
    t.goto(x, y)
    for i in range(20, 0, -5):
        t.begin_fill()
        if i == 20 or i == 5:
            t.color("red", "red")
        elif i == 15:
            t.color("blue", "blue")
        else:
            t.color("green", "green")
        t.circle(i)
        t.end_fill()
        t.up()
        t.goto(x, y + 25 - i)
        t.down()


def on_click(x, y, button, pressed):
    if pressed:
        circles(x, y)


with Listener(on_click=on_click) as listener:
    listener.join()

input()

完整错误:

Unhandled exception in listener callback
Traceback (most recent call last):
  File "C:\Users\XiaoPang\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pynput\_util\win32.py", line 380, in _handler
    converted = self._convert(code, msg, lpdata)
  File "C:\Users\XiaoPang\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pynput\_util\win32.py", line 395, in _convert
    raise NotImplementedError()
NotImplementedError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\XiaoPang\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pynput\_util\__init__.py", line 211, in inner
    return f(self, *args, **kwargs)
  File "C:\Users\XiaoPang\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pynput\_util\win32.py", line 384, in _handler
    self._handle(code, msg, lpdata)
  File "C:\Users\XiaoPang\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pynput\mouse\_win32.py", line 212, in _handle
    self.on_click(data.pt.x, data.pt.y, button, pressed)
  File "C:\Users\XiaoPang\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pynput\_util\__init__.py", line 127, in inner
    if f(*args) is False:
  File "C:/Users/XiaoPang/PycharmProjects/py1/py1.py", line 37, in on_click
    circles(x, y)
  File "C:/Users/XiaoPang/PycharmProjects/py1/py1.py", line 19, in circles
    t.up()
  File "C:\Users\XiaoPang\AppData\Local\Programs\Python\Python37-32\lib\turtle.py", line 2107, in penup
    self.pen(pendown=False)
  File "C:\Users\XiaoPang\AppData\Local\Programs\Python\Python37-32\lib\turtle.py", line 2425, in pen
    self._newLine()
  File "C:\Users\XiaoPang\AppData\Local\Programs\Python\Python37-32\lib\turtle.py", line 3287, in _newLine
    self._pencolor, self._pensize)
  File "C:\Users\XiaoPang\AppData\Local\Programs\Python\Python37-32\lib\turtle.py", line 545, in _drawline
    self.cv.coords(lineitem, *cl)
  File "<string>", line 1, in coords
  File "C:\Users\XiaoPang\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 2469, in coords
    self.tk.call((self._w, 'coords') + args))]
RuntimeError: main thread is not in main loop
Traceback (most recent call last):
  File "C:\Users\XiaoPang\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pynput\_util\win32.py", line 380, in _handler
    converted = self._convert(code, msg, lpdata)
  File "C:\Users\XiaoPang\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pynput\_util\win32.py", line 395, in _convert
    raise NotImplementedError()
NotImplementedError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:/Users/XiaoPang/PycharmProjects/py1/py1.py", line 40, in <module>
    listener.join()
  File "C:\Users\XiaoPang\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pynput\_util\__init__.py", line 259, in join
    six.reraise(exc_type, exc_value, exc_traceback)
  File "C:\Users\XiaoPang\AppData\Local\Programs\Python\Python37-32\lib\site-packages\six.py", line 702, in reraise
    raise value.with_traceback(tb)
  File "C:\Users\XiaoPang\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pynput\_util\__init__.py", line 211, in inner
    return f(self, *args, **kwargs)
  File "C:\Users\XiaoPang\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pynput\_util\win32.py", line 384, in _handler
    self._handle(code, msg, lpdata)
  File "C:\Users\XiaoPang\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pynput\mouse\_win32.py", line 212, in _handle
    self.on_click(data.pt.x, data.pt.y, button, pressed)
  File "C:\Users\XiaoPang\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pynput\_util\__init__.py", line 127, in inner
    if f(*args) is False:
  File "C:/Users/XiaoPang/PycharmProjects/py1/py1.py", line 37, in on_click
    circles(x, y)
  File "C:/Users/XiaoPang/PycharmProjects/py1/py1.py", line 19, in circles
    t.up()
  File "C:\Users\XiaoPang\AppData\Local\Programs\Python\Python37-32\lib\turtle.py", line 2107, in penup
    self.pen(pendown=False)
  File "C:\Users\XiaoPang\AppData\Local\Programs\Python\Python37-32\lib\turtle.py", line 2425, in pen
    self._newLine()
  File "C:\Users\XiaoPang\AppData\Local\Programs\Python\Python37-32\lib\turtle.py", line 3287, in _newLine
    self._pencolor, self._pensize)
  File "C:\Users\XiaoPang\AppData\Local\Programs\Python\Python37-32\lib\turtle.py", line 545, in _drawline
    self.cv.coords(lineitem, *cl)
  File "<string>", line 1, in coords
  File "C:\Users\XiaoPang\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 2469, in coords
    self.tk.call((self._w, 'coords') + args))]
RuntimeError: main thread is not in main loop

Process finished with exit code 1

错误发生是因为您正在使用按键侦听器触发circles函数。这将 运行 导致错误的后台线程中的函数。

更好的方法是使用turtle事件进程来处理鼠标点击。

试试这个代码:

from turtle import *

........

def on_click(x, y):
    circles(x, y)

onscreenclick(on_click, 1)  # left mouse button

mainloop()  # wait for exit

输出

我建议如果你使用 turtle,尽量在 turtle 内部工作,而不是导入可能与 turtle 冲突的冗余包:

from turtle import Screen, Turtle

def circles(x, y):
    screen.onclick(None)

    for i in range(20, 0, -5):
        turtle.goto(x, y - i)

        if i == 20 or i == 5:
            turtle.color('red')
        elif i == 15:
            turtle.color('blue')
        else:
            turtle.color('green')

        turtle.begin_fill()
        turtle.circle(i)
        turtle.end_fill()

    screen.onclick(circles)

screen = Screen()
screen.bgcolor('black')

turtle = Turtle()
turtle.hideturtle()
turtle.speed('fastest')
turtle.penup()

screen.onclick(circles)
screen.mainloop()