簡體   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