当按下鼠标并释放鼠标时,如何保存鼠标位置?

问题描述 投票:0回答:1

我目前正在使用python开发棋盘项目。我需要存储鼠标按下时的位置,以查看(x,y)坐标是否接触到一块。

[如果是的话,直到鼠标释放之前,棋子的坐标将与鼠标的坐标相同。我想创建一块跟随鼠标的效果。

然后,当发布它时,我想存储发布它的地方的代码,以便与这些一起使用。我听说过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))

我不太了解该模块背后的逻辑。我在网上找到了代码,并试图将值存储在变量中,但显然不起作用。

python python-3.x mouseevent mouselistener pynput
1个回答
0
投票

要在外部变量中存储值,您必须使用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)

但是如果您使用pygamepyglet或任何GUI框架(tkinterPyQTPySidewxPythonPyGTKKivy等),则它们具有自己的方法获取鼠标位置(bind()signalsevents等),而无需使用pynput

© www.soinside.com 2019 - 2024. All rights reserved.