Как я могу сохранить положение мыши, когда она нажата и когда отпущена? - PullRequest
0 голосов
/ 05 января 2020

В настоящее время я работаю над проектом шахматной доски в python. Мне нужно сохранить положение мыши, когда она нажата, чтобы увидеть, касаются ли координаты (x, y) части.

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

Затем, когда он будет выпущен, я хочу сохранить coodinates того места, где он был выпущен, для работы с ними. Я слышал о pynput и установил его, но я все еще новичок в этом.

Это не в моем основном файле, но это попытка определить положение мыши при нажатии:

from pynput import mouse


mx, my = 0, 0


def on_click(x, y, button, pressed):
    print('{0} at {1}'.format(
        'Pressed' if pressed else 'Released',
    (x, y)))
    mx = x
    my = y
    if not pressed:
        # Stop listener
        return False


with mouse.Listener(
        on_click=on_click) as listener:
    listener.join()

print(str(mx) + str(my))

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

1 Ответ

0 голосов
/ 06 января 2020

Для хранения значений во внешних переменных вы должны использовать global

Но обычно весь код выполняется внутри on_click, и тогда нет необходимости использовать global


from pynput import mouse

pressed_x = 0
pressed_y = 0

released_x = 0
released_y = 0

is_pressed = False
is_released = False

def on_click(x, y, button, pressed):
    global pressed_x
    global pressed_y

    global released_x
    global released_y

    global is_pressed
    global is_released

    # store in external variables
    if pressed:
        is_pressed = True
        pressed_x = x
        pressed_y = y
        #print('LISTENER: pressed:', pressed_x, pressed_y)
    else:        
        is_released = True
        released_x = x
        released_y = y
        #print('LISTENER: released:', released_x, released_y)

    #if not pressed:
    #    # Stop listener
    #    return False

# --- main ---

# start listener at the beginning
listener = mouse.Listener(on_click=on_click)
listener.start()

# use variables in your code
while True:
    if is_pressed:
        print('RUN: pressed:', pressed_x, pressed_y)
        is_pressed = False
    if is_released:
        print('RUN: released:', released_x, released_y)
        is_released = False

# stop listener at the end
listener.stop()            
listener.join()

print('END: pressed:', pressed_x, pressed_y)
print('END: released:', released_x, released_y)

Но если вы используете pygame, pyglet или любой GUI каркас (tkinter, PyQT, PySide, wxPython, PyGTK, Kivy и т. д. c.) тогда у них есть собственные методы для определения положения мыши (bind(), signals, events и др. c.), и нет необходимости использовать pynput.

.
...