【问题标题】:How can I ignore all user inputs for duration of function run?如何在函数运行期间忽略所有用户输入?
【发布时间】:2020-02-01 03:47:19
【问题描述】:

我有一个 Python 模块,它使用 pynput 侦听组合键,然后一旦按下它,它就会在文本程序中键入一个字符串。

效果很好!除了...

在下面的示例中,用户的组合键设置为 shift + space。这很有意义,并且可能是运行我的程序的 Windows 用户最常用的选择键命令。问题是,当按住 shift 键时,它会改变 pynput 的类型。它将键入 )!/20/2019,而不是 01/20/2019。

我需要一种方法来禁用键盘,直到 pyautogui 完成输入字符串。非常感谢您的帮助!!!

额外问题:当组合键包含 ctrl 键时,我似乎无法获得结果。 Key.ctrl 根本无法触发,而其他键工作正常。

from pynput.keyboard import Key, Controller, Listener
import time

keyboard = Controller()

def insert():                                 # check line 1 of config file 
     keyboard.type('01/20/2019')

# The currently active modifiers
current = set()

def on_press(key):
    if key in COMBINATION:
        current.add(key)
        if all(k in current for k in COMBINATION):      # I don't know what this k in current for k shit is.
            current.remove(key)
            insert()                                # run insert

    if key == Key.esc:
        listener.stop()


def on_release(key):
    try:
        current.remove(key)
    except KeyError:
        pass

with Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()
``

【问题讨论】:

  • 您可能会在尝试同时使用pynputpyautogui 时遇到冲突,因为它们都处理用户事件。你可以通过写一些只使用前者的东西来验证这一点,看看是否有类似的问题。
  • 谢谢。你会认为这个问题出乎意料吗?无论我使用哪个模块键入字符串,它都会发生对我来说似乎是有道理的。我尝试使用 pynput 的 keyboard.type 方法,但由于某种原因它根本不会触发任何东西。
  • 我成功地让 pynput 的 keyboard.type(insert.timestamp) 工作,但正如我所建议的,问题是一样的。不过,我很高兴它的类型,因为 pyautogui 不适用于 OSX 用户。谢谢!
  • 不,这不足为奇,因为它在某种程度上是每个模块所做的固有或固有的。可能有解决方法……或者您可以使用pyautogui 完成所需的一切。
  • 现在完全使用 pynput,但问题仍然存在。

标签: python user-input pynput


【解决方案1】:

您可以在输入之前使用pyautogui.keyUp("shift")

def insert():
f=open('tc.txt')
line=f.readlines()
insert.timestamp=(line[0])
time.sleep(.1)
pyautogui.keyUp("shift")
pyautogui.typewrite(insert.timestamp)

【讨论】:

  • 好主意!这很好用。也就是说,既然我已经用 pynput 编写了文本(由于多平台原因而首选),是否有类似的 pynput 功能,或者我应该回到我的 pyautogui 解决方案并在 Mac 上使用 osascript?
  • 使用keyboard.release(Key.shift)(其中keyboard = Controller())
  • 完美运行!...开玩笑。很好的解决方案,非常感谢!如何将问题标记为已解决?
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 2023-01-12
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
相关资源
最近更新 更多