【问题标题】:Fixing NameError: NameError: name 'key_p' is not defined?修复 NameError: NameError: name 'key_p' is not defined?
【发布时间】:2019-02-22 07:44:55
【问题描述】:

我编写了下面的击键系统,它将来自on_press() 函数和on_release()? 函数的值返回到一个名为key_dict 的字典中。运行脚本,即使我在两个函数中都全局定义了它,也会返回 NameError。

有什么想法吗? 谢谢

from pynput.keyboard import Key, Listener
from datetime import datetime


def on_press(key):
    global key_p,key_pt,key_r,key_rt
    key_p = key
    key_pt = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')
    keyall = {'Key_Pressed':key_p, 'Key_Time':key_pt}
    return key_p, key_pt

def on_release(key):
    global key_p,key_pt,key_r,key_rt
    key_r = key
    key_rt = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')
    keysall = {'Key_Released':key_r, 'Release_Time':key_rt}
    return key_r, key_rt
    if key == Key.enter:
        # Stop listener
        return False

key_dict = {'Key_Pressed':[key_p],
            'Key_Time':[key_pt],
            'Key_Released':[key_r],
            'Release_Time':[key_rt]}

print(key_dict)


# Collect events until released
with Listener(
        on_press=on_press,
        on_release=on_release) as listener:
    listener.join()

【问题讨论】:

    标签: python function keystroke


    【解决方案1】:

    使用global 告诉python 使用名为key_p 的全局变量,它不会初始化它。

    您应该首先在全局范围内初始化您的全局变量。然后在每个函数上使用global关键字。


    编辑:

    key_dict = {'Key_Pressed':[key_p],
                'Key_Time':[key_pt],
                'Key_Released':[key_r],
                'Release_Time':[key_rt]}
    

    key_p 未在此处定义,因为您在全局范围内。 key_pon_press 函数内部初始化。

    【讨论】:

    • 您好,Carles,感谢您的回复。我在函数外部初始化了变量并且它起作用了。但它只显示了我初始化的值。如何用用户输入的内容动态替换初始值?例如; key_p = on_press()
    • @aa888817 您应该在on_release 中初始化并打印key_dict。这样所有变量key_X 都将具有正确的值。
    猜你喜欢
    • 2019-11-27
    • 2022-12-02
    • 1970-01-01
    • 2022-11-23
    • 2013-04-09
    • 2020-11-07
    • 2017-01-09
    • 2017-06-14
    相关资源
    最近更新 更多