![](/img/trans.png)
[英]Runtime Error: main thread is not in main loop: turtle graphics and python
[英]How to fix 'main thread is not in main loop' error in turtle, python library?
我正在尝试使用Pynput和Turtle库使用笔记本触控板模拟数字化仪平板电脑,但是我一直在遇到同样的错误:
RuntimeError:主线程不在主循环中
这是完整的代码:
from pynput import mouse
import turtle as tt
import time
tt.speed(0)
class MyException(Exception): pass
def on_move(x,y):
print('Pointer: {0}'.format((x,y)))
pos = (x,y)
tt.setpos(pos)
def on_click(x, y, button, pressed):
if button == mouse.Button.left:
raise MyException(button)
with mouse.Listener(
on_click=on_click,
on_move=on_move) as listener:
try:
listener.join()
except MyException as e:
print('{0} was clicked'.format(e.args[0]))
from pynput.mouse import Listener
def on_move(x, y):
print('Pointer moved to {0}'.format(
(x, y)))
def on_click(x, y, button, pressed):
print('{0} at {1}'.format(
'Pressed' if pressed else 'Released',
(x, y)))
if not pressed:
# Stop listener
return False
def on_scroll(x, y, dx, dy):
print('Scrolled {0}'.format(
(x, y)))
# Collect events until released
with Listener(
on_move=on_move,
on_click=on_click,
on_scroll=on_scroll) as listener:
listener.join()
我猜您只是在导入pynput
因为乌龟屏幕对象缺少其tkinter支撑的'Motion'
事件。 如果是这样,我们可以改为将丢失的事件安装到turtle中以实现您的数字化仪:
from turtle import Turtle, Screen, Vec2D
from functools import partial
class MyException(Exception):
pass
def onscreenmove(self, fun, add=None):
''' Event method missing from turtle '''
if fun is None:
self.cv.unbind('<Motion>')
else:
def eventfun(event):
fun(self.cv.canvasx(event.x) / self.xscale, -self.cv.canvasy(event.y) / self.yscale)
self.cv.bind('<Motion>', eventfun, add)
def on_left_click(x, y):
raise MyException(Vec2D(x, y))
def on_move(x, y):
screen.onmove(None) # disable events inside handler
print('Pointer: {0}'.format(Vec2D(x, y)))
turtle.setheading(turtle.towards(x, y))
turtle.goto(x, y)
screen.onmove(on_move) # reenable handler
turtle = Turtle()
turtle.speed('fastest')
screen = Screen()
screen.onmove = partial(onscreenmove, screen) # install missing method
screen.onmove(on_move)
screen.onclick(on_left_click, btn=1) # btn=1 is the default
screen.mainloop()
屏幕
安慰
> python3 test.py
Pointer: (336.00,-73.00)
Pointer: (289.00,-56.00)
Pointer: (256.00,-43.00)
Pointer: (233.00,-35.00)
Pointer: (220.00,-31.00)
Pointer: (216.00,-30.00)
...
Pointer: (139.00,-37.00)
Pointer: (131.00,-35.00)
Pointer: (117.00,-25.00)
Pointer: (165.00,-24.00)
Pointer: (275.00,-28.00)
Pointer: (337.00,-29.00)
Exception in Tkinter callback
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/tkinter/__init__.py", line 1705, in __call__
return self.func(*args)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/turtle.py", line 675, in eventfun
fun(x, y)
File "test.py", line 20, in on_left_click
raise MyException(Vec2D(x, y))
MyException: (151.00,334.00)
Pointer: (150.00,334.00)
Pointer: (147.00,334.00)
Pointer: (143.00,334.00)
...
Pointer: (20.00,273.00)
Pointer: (-46.00,306.00)
Pointer: (-141.00,360.00)
>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.