сюжет движения мыши питона - PullRequest
0 голосов
/ 24 мая 2018

Я хотел бы представить движение мыши почти в реальном времени, используя matplotlib и pynput, но я подозреваю, что у меня возникают некоторые проблемы с блокируемым кодом.Код использует упрощенную версию этот ответ .

import matplotlib.pyplot as plt
from pynput import mouse
from time import sleep

fig, ax = plt.subplots()

ax.set_xlim(0, 1920-1)
ax.set_ylim(0, 1080-1)
plt.show(False)
plt.draw()

x,y = [0,0]
points = ax.plot(x, y, 'o')[0]
# cache the background
background = fig.canvas.copy_from_bbox(ax.bbox)

def on_move(x, y):
    points.set_data(x,y)
    # restore background
    fig.canvas.restore_region(background)
    # redraw just the points
    ax.draw_artist(points)
    # fill in the axes rectangle
    fig.canvas.blit(ax.bbox)

with mouse.Listener(on_move=on_move) as listener:
    sleep(10)

Код, кажется, останавливается на ax.draw_artist(points).Прослушиватель мыши pynput имеет значение threading.Thread, и все обратные вызовы вызываются из потока.Я недостаточно знаком с внутренней работой matplotlib или threading, чтобы определить причину.

1 Ответ

0 голосов
/ 29 мая 2018

Это может вызвать проблемы при запуске потока с вводом GUI параллельно с GUI matplotlib.
В любом случае, может иметь больше смысла использовать только инструменты matplotlib.Доступен механизм обработки событий , который обеспечивает "motion_notify_event" для получения текущей позиции мыши.Обратный вызов, зарегистрированный для этого события, затем сохранит позицию мыши и переместит обновленные точки.

import matplotlib.pyplot as plt


fig, ax = plt.subplots()

ax.set_xlim(0, 1920-1)
ax.set_ylim(0, 1080-1)

x,y = [0], [0]
# create empty plot
points, = ax.plot([], [], 'o')

# cache the background
background = fig.canvas.copy_from_bbox(ax.bbox)

def on_move(event):
    # append event's data to lists
    x.append(event.xdata)
    y.append(event.ydata)
    # update plot's data  
    points.set_data(x,y)
    # restore background
    fig.canvas.restore_region(background)
    # redraw just the points
    ax.draw_artist(points)
    # fill in the axes rectangle
    fig.canvas.blit(ax.bbox)


fig.canvas.mpl_connect("motion_notify_event", on_move)
plt.show()
...