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()
我只是为了好玩而涂鸦,我想做的是每次单击时在鼠标上画一个圆圈设计。如果我将 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()