从侦听器内部引用全局变量时出现pynput UnboundLocalError

时间:2018-07-18 13:38:23

标签: python pynput

我正在编写一个脚本,以便在用户每次按下按键时键入内容。我最终不得不在侦听器之前定义一个全局变量,并从侦听器内部对其进行引用,尽管事先进行了明确定义,但还是遇到了UnboundLocalError。这是代码:

import pynput

controller = pynput.keyboard.Controller()
is_typing = False
def on_press(key):
    if not is_typing:
        is_typing = True
        controller.type('test')
        is_typing = False

with pynput.keyboard.Listener(on_press=on_press) as listener:
    listener.join()

在脚本运行时按一个键后,出现此错误:

Traceback (most recent call last):
  File ".\typer.py", line 12, in <module>
    listener.join()
  File "C:\Python35\lib\site-packages\pynput\_util\__init__.py", line 199, in join
    six.reraise(exc_type, exc_value, exc_traceback)
  File "C:\Python35\lib\site-packages\six.py", line 692, in reraise
    raise value.with_traceback(tb)
  File "C:\Python35\lib\site-packages\pynput\_util\__init__.py", line 154, in inner
    return f(self, *args, **kwargs)
  File "C:\Python35\lib\site-packages\pynput\keyboard\_win32.py", line 237, in _process
    self.on_press(key)
  File "C:\Python35\lib\site-packages\pynput\_util\__init__.py", line 75, in inner
    if f(*args) is False:
  File ".\typer.py", line 6, in on_press
    if not is_typing:
UnboundLocalError: local variable 'is_typing' referenced before assignment

我正在Windows 10,python 3.5.2和pynput 1.4上运行

1 个答案:

答案 0 :(得分:0)

您正在访问尚未初始化的函数内部的全局声明的变量,因为pynput的键盘侦听器被视为线程处理,并且具有不同的scope。 因此,您必须在访问变量之前将其指定为全局变量。

def on_press(key):
 # global is_typing
 print globals()
 global is_typing
 if not is_typing:
    is_typing = True
    controller.type('test')
    is_typing = False