Почему эта функция debounce не работает?

#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 as var .

3. вы правы — я не заметил, что вы поменяли местами значения db и var.