【问题标题】:Using Mouse and Keyboard Listeners Together in Python在 Python 中同时使用鼠标和键盘监听器
【发布时间】:2018-02-08 22:30:18
【问题描述】:

我一直在使用 pynput 库来监控鼠标的点击。我面临的唯一问题是终端不会在按下 Ctrl+C 时终止。我需要将键盘监听器与鼠标监听器一起使用。这是我的代码:

import os
import time
import re
from pynput import mouse
from pynput.keyboard import Key, Listener
f=open('maniac1.txt','a')

inc=1
f.write('<mouse_new>\n')

def on_click(x, y, button, pressed):
    f=open('maniac1.txt','a')
    if button == mouse.Button.left:
        print 'Left'
        f.write('left\n')

    if button == mouse.Button.right:
        print 'right'
        f.write('right\n')
    if button == mouse.Button.middle:
        print 'middle'
        f.write('middle\n')

with mouse.Listener(on_click=on_click,on_scroll=on_scroll) as listener:
    try:
        listener.join()
    except MyException as e:
        print('Done'.format(e.args[0]))

按 Esc 或 Ctrl+C 后如何终止此代码?我使用的是 OSX。

【问题讨论】:

  • 按“option + c”
  • 我已经提到我使用了 option+C 。它不起作用。程序不会终止。我想用鼠标监听器添加键盘监听器

标签: python macos keylistener


【解决方案1】:

创建一个没有“with”关键字的实例keyboard.Listener,以便您可以根据您的鼠标侦听器启动和停止侦听器。检查下面的代码,鼠标右键单击后将停止监听 f8 的按键。

import os
import time
import re
from pynput import mouse
from pynput.keyboard import Key, Listener
#f=open('maniac1.txt','a')

inc=1
#f.write('<mouse_new>\n')
from pynput import keyboard

def on_functionf8(key):
    if (key==keyboard.Key.f8):
        print('f8 is pressed')


key_listener = keyboard.Listener(on_release=on_functionf8)
key_listener.start()


def on_click(x, y, button, pressed):
    f=open('maniac1.txt','a')
    if button == mouse.Button.left:
        print ('Left')
        #f.write('left\n')

    if button == mouse.Button.right:
        key_listener.stop()
        print ('right')
        #f.write('right\n')
    if button == mouse.Button.middle:
        print ('middle')
        #f.write('middle\n')

with mouse.Listener(on_click=on_click) as listener:
    try:
        listener.join()
    except MyException as e:
        print('Done'.format(e.args[0]))

运行程序并按 f8,您将在终端上看到“按 f8”。但是右键单击并按f8。当我们在鼠标右键单击时停止键盘侦听器时,您不会看到任何打印内容。

Mac 版:

def on_press(key):
    try:
        print('alphanumeric key {0} pressed'.format(
            key.char))
    except AttributeError:
        print('special key {0} pressed'.format(
            key))



key_listener = keyboard.Listener(on_release=on_press)

mac 上默认只监听 cmd、alt 等几个键。

【讨论】:

  • Nope..它没有显示 F8 被按下。我也尝试在右键单击后按 F8。它只显示鼠标单击。即左/右/中。
  • 默认情况下,mac 保护免受键盘记录器的影响,除了 cmd、alt 等少数键外,不允许您收听按键。这完全是不同的问题。如果要检查功能,请打印每个键并尝试按 cmd 或 alt。将此添加到答案中。请检查。
  • 是的,你是对的。它只听特殊键,如'Shift'、'cntrl'、'command'。但我希望操作系统也能听其他字母数字键。我怎样才能做到这一点?
  • 考虑到苹果的限制,在 Mac 上实现这一目标是一项艰巨的任务。这方面有很多悬而未决的问题。如果您认为我已经回答了您结合键盘和鼠标控制的实际问题..,请接受此作为答案
【解决方案2】:

这段代码同时使用鼠标和键盘监听器。

from pynput.keyboard import Listener  as KeyboardListener
from pynput.mouse    import Listener  as MouseListener
from pynput.keyboard import Key
import logging

logging.basicConfig(filename=("log.txt"), level=logging.DEBUG, format='%(asctime)s: %(message)s')

def end_rec(key):
    logging.info(str(key))

def on_press(key):
    logging.info(str(key))

def on_move(x, y):
    logging.info("Mouse moved to ({0}, {1})".format(x, y))

def on_click(x, y, button, pressed):
    if pressed:
        logging.info('Mouse clicked at ({0}, {1}) with {2}'.format(x, y, button))

def on_scroll(x, y, dx, dy):
    logging.info('Mouse scrolled at ({0}, {1})({2}, {3})'.format(x, y, dx, dy))


with MouseListener(on_click=on_click, on_scroll=on_scroll) as listener:
    with KeyboardListener(on_press=on_press) as listener:
        listener.join()

【讨论】:

  • 解释你的答案是什么,以便其他用户理解
  • 主要思想是缩进“with”。我在我的代码中重现了这个概念,并且效果很好。用户@0rk 准确地回答了问题:“如何在 Python 中同时使用鼠标和键盘监听器”。
【解决方案3】:

几个小时前我刚刚完成了同样的事情,这是我写的。

首先添加另一个键盘监听器:

# Collect events until released
with keyboard.Listener(on_release=on_release) as k_listener, \
        mouse.Listener(on_click=on_click) as m_listener:
    k_listener.join()
    m_listener.join()

然后添加on_release函数:

def on_release(key):
    if key == keyboard.Key.esc:
        # Stop listeners
        m_listener.stop()
        return False

那么如果你按下Esc这个代码将会被终止。

对于 OSX,您需要使用 sudo 运行 python,否则它将无法正常工作。

【讨论】:

  • 非常好!这是唯一可以正常工作的代码!难怪在我之前你没有得到任何支持! (这里不支持真正好的答案!)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
  • 2015-10-29
相关资源
最近更新 更多