繁体   English   中英

如何修复Turtle,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()

来自https://pythonhosted.org/pynput/mouse.html

我猜您只是在导入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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM