#python #button #debounce
#python #кнопка #отмена
Вопрос:
Итак, я пытаюсь сделать простой debounce, и я просто не могу понять, где я напортачил. Вот код:
def debounce(var, db):
if var == 1 and db == 0:
db = 1
elif var == 0:
db = 0
else:
var = 0
return var, db
while True:
mouse_buttons = get_mouse_buttons() # -This is the fuction that if the mouse's buttons are pressed
pressed, db = debounce(mouse_buttons[0], db)
mouse_buttons = (pressed, 0, 0)
print(mouse_buttons[0])
Мой ожидаемый результат был бы, если бы я нажал кнопку мыши, тогда это было бы 1 на один раз, затем поверните 0, пока я не отпущу и не нажму его снова. Текущий код выдает 1 в первый раз, и, несмотря ни на что, после этого он выдает только 0. (Я протестировал ее, она не имеет ничего общего с функцией, которая возвращает нажатые кнопки мыши.)
Комментарии:
1. Можете ли вы рассказать немного больше об ожидаемом результате работы функции и о том, что не работает должным образом (неожиданный возврат? Ошибка?) Спасибо!
2. Извините за недостаток информации, я отредактировал ее, чтобы быть более точной.
3. с какого значения начинается база данных — просто полнота формы?
4. На самом деле это работает для меня при замене функции
get_mouse_buttons()
def get_mouse_buttons(): return [int(input())]
на имитацию щелчка с помощью ввода.5. @HemChab — это наводит
get_mouse_buttons()
на мысль, что он делает не то, что ожидается.
Ответ №1:
Просто чтобы подтвердить ваши ожидания от тестирования
var | db | var,db
----------------------
0 0 0,0
0 1 0,0
1 0 1,1
1 1 0,1
Если это правильно, то я не уверен, что ваша функция действительно это делает.
Это проще — воспроизвести ту же логическую таблицу.
def debounce(var, db):
return var and not db, var
В этом случае, когда var равен 0 — это вернет 0,0
Когда var равен 1, это вернет 1,1, если db == 0
Когда var равен 0, это вернет 0,1, если db == 1
Добавление — когда я повторно запустил ваш код с get_mouse_buttons()
заменой на this :
def get_mouse_buttons():
return (int(input('>>').lower()=='y'), 0, 0)
Когда вы решаете (набрав Y / y), нажата ли кнопка мыши, оказывается, что ваш код отмены — хотя неуклюжий на самом деле делает то, что ожидается — ваш цикл печатает только 1, когда вы вводите «y» изначально, или вы переходите от не «y» кa ‘y’ — т.е. Ваш код правильно определяет начальное изменение с не нажатого на нажатое.
Поскольку вы заявляете, что ваш код не работает, очевидным подозрением является ваша функция get_mouse_buttons(), которая, как вы утверждали, работает нормально.
Комментарии:
1. Очень ясно, что это логическая таблица, но я думаю, что это действительно так: если
var=0
, то выполняется второе условие, поэтому var остается равным 0, а db устанавливается в 0, поэтому он возвращается(0, 0)
. Еслиvar=1
иdb=0
, мы находимся в первом условии, и оно возвращается(1, 1)
, когда db становится 0. Наконец, еслиvar=1
иdb=1
, мы находимся в третьем условии, и оно возвращается(0, 1)
, поскольку var установлен в 0. я что-то упускаю? Это должно дать правильный результат.2. @HenriChab — возможно, я неправильно проанализировал несколько if — я предпочитаю логику, а не вложенные and.
3. Ваше решение определенно лучше! Но я пытаюсь понять, почему его решение не работает
4. @HenriChab как вы предлагаете — это работает, когда вы используете
input
so, чтобы предложить (как я упоминал в другой цепочке комментариев), чтоget_mouse_buttons()
не работает.
Ответ №2:
debounce всегда нужно устанавливать db
. Вы делаете это не во всех случаях. Если вы хотите pressed
быть разоблаченной ценностью, тогда вы хотите:
def debounce(var, db):
if var == 1 and db == 0:
db = 1
else:
db = 0
return db, var
Чтобы понять это, запишите состояния на бумаге с течением времени:
var = 0 1 1 1 1 1 1 0 0 0 1 1 1
db = 0 1 0 0 0 0 0 0 0 0 1 0 0
Комментарии:
1. проблема в том, что когда db уже равен 1, он хочет вернуть var как 0 — т.е. Игнорировать продолжающиеся нажатия кнопок.
2. В этом случае он хочет, чтобы первый параметр возвращал 0. Это делает это. Обратите внимание, что я поменял порядок возвращаемых значений.
db
В его основной программе должна быть память о том, какое фактическое нажатие кнопки было в последний раз. Это входит вdebounce
asvar
.3. вы правы — я не заметил, что вы поменяли местами значения db и var.