问题描述
我正在尝试为我的键盘制作一个键盘映射,以便不使用 Microsoft 无用 IME keyboard
。
所以我用 python
写了这个 pynput
代码。
但它似乎没有执行我的execute()
函数
from pynput.keyboard import Key,Controller
current = set()
keyboard_typ = Controller()
COMBINATIONS = [
{keyboard.KeyCode(char="q")},{keyboard.KeyCode(char="Q")},{keyboard.KeyCode(char="w")},{keyboard.KeyCode(char="W")},{keyboard.KeyCode(char="e")},{keyboard.KeyCode(char="E")},{keyboard.KeyCode(char="r")},{keyboard.KeyCode(char="R")},{keyboard.KeyCode(char="t")},{keyboard.KeyCode(char="T")},{keyboard.KeyCode(char="y")},{keyboard.KeyCode(char="Y")},{keyboard.KeyCode(char="u")},{keyboard.KeyCode(char="U")},{keyboard.KeyCode(char="i")},{keyboard.KeyCode(char="I")},{keyboard.KeyCode(char="o")},{keyboard.KeyCode(char="O")},{keyboard.KeyCode(char="p")},{keyboard.KeyCode(char="P")},{keyboard.KeyCode(char="a")},{keyboard.KeyCode(char="A")},{keyboard.KeyCode(char="s")},{keyboard.KeyCode(char="S")},{keyboard.KeyCode(char="d")},{keyboard.KeyCode(char="D")},{keyboard.KeyCode(char="f")},{keyboard.KeyCode(char="F")},{keyboard.KeyCode(char="g")},{keyboard.KeyCode(char="G")},{keyboard.KeyCode(char="h")},{keyboard.KeyCode(char="H")},{keyboard.KeyCode(char="j")},{keyboard.KeyCode(char="J")},{keyboard.KeyCode(char="k")},{keyboard.KeyCode(char="K")},{keyboard.KeyCode(char="l")},{keyboard.KeyCode(char="L")},{keyboard.KeyCode(char="z")},{keyboard.KeyCode(char="Z")},{keyboard.KeyCode(char="x")},{keyboard.KeyCode(char="X")},{keyboard.KeyCode(char="c")},{keyboard.KeyCode(char="C")},{keyboard.KeyCode(char="v")},{keyboard.KeyCode(char="V")},{keyboard.KeyCode(char="b")},{keyboard.KeyCode(char="B")},{keyboard.KeyCode(char="n")},{keyboard.KeyCode(char="N")},{keyboard.KeyCode(char="m")},{keyboard.KeyCode(char="M")},]
def on_press(key) :
if any([key in COMBO for COMBO in COMBINATIONS]):
current.add(key)
if any(all(k in current for k in COMBO) for COMBO in COMBINATIONS):
execute()
def execute() :
if current == "q":
print("q")
def on_release(key) :
if any([key in COMBO for COMBO in COMBINATIONS]):
current.remove(key)
with keyboard.Listener(on_press=on_press,on_release=on_release) as listener :
listener.join()
解决方法
在考虑 Joaquín 的“set to string”理论后,我将 set
转换为 string
它奏效了。
感谢华金。
def execute(current_key) :
s = str(current_key)
for i in s :
if i == "q" :
print("q")
#print("\bㅂ") I tested it with a language and it types the normal text too so I prefer adding\b before the letter/word/sentence
,
execute() 有 current
但你从来没有把这样的变量传递给函数,所以你没有比较。你的函数应该是这样的
def execute(current) :
if current == "q":
print("q")
,
如果您将 current
传递给函数,它将立即按下所有键并使用循环或 if 条件来检查按下的键中的键。或者如果您只需要按下最后一个键,只需传递 key
。
def on_press(key) :
if any([key in COMBO for COMBO in COMBINATIONS]):
current.add(key)
if any(all(k in current for k in COMBO) for COMBO in COMBINATIONS):
execute(current)
def execute(current_key_set) :
for key in current_key_set:
print(key)
或
def on_press(key) :
if any([key in COMBO for COMBO in COMBINATIONS]):
current.add(key)
if any(all(k in current for k in COMBO) for COMBO in COMBINATIONS):
execute(key)
def execute(current_key) :
print(current_key)