简体   繁体   English

如何修复Turtle,Python库中的“主线程不在主循环中”错误?

[英]How to fix 'main thread is not in main loop' error in turtle, python library?

I'm trying to emulate a digitizer tablet with my notebook trackpad using the libraries Pynput and Turtle, but I keep geeting this same error: 我正在尝试使用Pynput和Turtle库使用笔记本触控板模拟数字化仪平板电脑,但是我一直在遇到同样的错误:

RuntimeError: main thread is not in main loop RuntimeError:主线程不在主循环中

Here's the full code: 这是完整的代码:

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()

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

I'm guessing that you're only importing pynput because the turtle screen object lacks the 'Motion' event of its tkinter underpinning. 我猜您只是在导入pynput因为乌龟屏幕对象缺少其tkinter支撑的'Motion'事件。 If so, we can instead install the missing event into turtle to implement your digitizer: 如果是这样,我们可以改为将丢失的事件安装到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()

SCREEN 屏幕

在此处输入图片说明

CONSOLE 安慰

> 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