Перезаписывается переменная, а не должна
Мне необходимо отследить нажатия клавиатуры и если подряд будет нужное сочетание букв выполнить определённый код(эта часть работает) и ещё надо отслеживать состояние кода, то есть если первое действие действие не было выполнено(не был набран определённый набор символов) второе действие не выполнялось(защита от ложного срабатывания). Проблема в том что функция on_press не хочет принимать второй аргумент и выпадает в ошибку, а если я пытаюсь инициализироать переменную состояния внутри функции, то она перезаписывается при каждой итерации функции, хотя я попятался установить защиту от этого. Вот мой код:
from pynput import keyboard
mass = ['0', '0', '0', '0', '0', '0,']
obraz_m = ["'m'", "'i'", "'c'", "'u'", "'r'", "'i'"]
obraz_naz = ["'g'", "'o'", "'b'", "'a'", "'c'", "'k'"]
#sost = False
def naz(key):
try:
sost = sost
except NameError:
sost = False
print('отладочное сообщение')
mass[0] = mass[1]
mass[1] = mass[2]
mass[2] = mass[3]
mass[3] = mass[4]
mass[4] = mass[5]
key = str(key)
mass[5] = key
print(mass)
print(sost)
if mass == obraz_m and sost == False:
print('horay')
sost = True
print(sost)
elif mass == obraz_naz and sost == True:
print('back tak back')
sost = False
print(sost)
def otz(key):
if key == keyboard.Key.esc:
return False
with keyboard.Listener(on_press=naz, on_release=otz) as listener:
listener.join()
А если подать второй аргумент, то появляется такая ошибка:
Unhandled exception in listener callback
Traceback (most recent call last):
File "C:\Program Files (x86)\Python37-32\lib\site-packages\pynput\_util\__init__.py", line 162, in inner
return f(self, *args, **kwargs)
File "C:\Program Files (x86)\Python37-32\lib\site-packages\pynput\keyboard\_win32.py", line 280, in _process
self.on_press(key)
File "C:\Program Files (x86)\Python37-32\lib\site-packages\pynput\_util\__init__.py", line 78, in inner
if f(*args) is False:
TypeError: naz() missing 1 required positional argument: 'key'
Traceback (most recent call last):
File "C:/Users/Kirill/Desktop/cmena_oboi/main.py", line 41, in <module>
listener.join()
File "C:\Program Files (x86)\Python37-32\lib\site-packages\pynput\_util\__init__.py", line 210, in join
six.reraise(exc_type, exc_value, exc_traceback)
File "C:\Program Files (x86)\Python37-32\lib\site-packages\six.py", line 695, in reraise
raise value.with_traceback(tb)
File "C:\Program Files (x86)\Python37-32\lib\site-packages\pynput\_util\__init__.py", line 162, in inner
return f(self, *args, **kwargs)
File "C:\Program Files (x86)\Python37-32\lib\site-packages\pynput\keyboard\_win32.py", line 280, in _process
self.on_press(key)
File "C:\Program Files (x86)\Python37-32\lib\site-packages\pynput\_util\__init__.py", line 78, in inner
if f(*args) is False:
TypeError: naz() missing 1 required positional argument: 'key'
Ответы (1 шт):
А если переменную sost использовать как глобальную в функции? Видимо ты пытался, но из за того, что она была локальной, тебе било ошибку.
from pynput import keyboard
mass = ['0', '0', '0', '0', '0', '0,']
obraz_m = ["'m'", "'i'", "'c'", "'u'", "'r'", "'i'"]
obraz_naz = ["'g'", "'o'", "'b'", "'a'", "'c'", "'k'"]
sost = False
def naz(key):
global sost
mass[0] = mass[1]
mass[1] = mass[2]
mass[2] = mass[3]
mass[3] = mass[4]
mass[4] = mass[5]
key = str(key)
mass[5] = key
print(mass)
print(sost)
if mass == obraz_m and sost == False:
print('horay')
sost = True
print(sost)
elif mass == obraz_naz and sost == True:
print('back tak back')
sost = False
print(sost)
def otz(key):
if key == keyboard.Key.esc:
return False
with keyboard.Listener(on_press=naz, on_release=otz) as listener:
listener.join()