Питон: Как переключить логическое значение в цикле while после нажатия клавиши без его двойной активации?

#python #toggle #cv2

Вопрос:

У меня есть бесконечный цикл while, работающий до тех пор, пока я не нажму клавишу, чтобы выйти из него. В настоящее время у меня есть оператор if, который переключает логическое значение, если я нажимаю клавишу.

 if keyboard.is_pressed('s'):  armed = not armed  

Когда я запускаю цикл и нажимаю клавишу, иногда она активируется дважды, потому что клавиша была нажата достаточно долго во время нажатия, чтобы быть активированной в следующей итерации цикла while.

Существуют ли какие-либо решения, которые не предполагают задержки в цикле while? Это сценарий на основе cv2, поэтому любые задержки приведут к снижению частоты кадров в секунду при съемке видео.

Комментарии:

1. Я предполагаю, что вы используете armed это в качестве условия для выхода из цикла while… Почему бы просто не установить его на False значение вместо того, чтобы инвертировать его?

2. Извините за путаницу, но я использую «вооружен» в качестве переключателя для другой системы, которая находится в массивном цикле while.

Ответ №1:

Вы могли бы отслеживать время, в течение которого вы обнаруживаете прессу. Все, что находится в пределах временного интервала оттуда, игнорируется.

 import time   last_press = time.time() key_delay_seconds = 1.0 armed = False  while True:  if keyboard.is_pressed('s'):  if cur_time := time.time() gt; last_press   key_delay_seconds:  armed = not armed  last_press = cur_time  print(armed)