Python 为什么这个去盎司功能不起作用?
所以我试着做一个简单的去盎司,我只是不知道我在哪里搞砸了。 代码如下:Python 为什么这个去盎司功能不起作用?,python,button,debounce,Python,Button,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
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。(我对它进行了测试,它与返回鼠标上按下的按钮的功能无关。)debounce始终需要设置
db
。并非所有情况下都是这样。如果要将按下的作为取消公告值,则需要:
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
只是为了确认你的测试期望
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时,如果db==0,则返回1,1
当var为0时,如果db==1,则返回0,1
附录-当我重新运行您的代码时,get\u mouse\u buttons()
替换为:
def get_mouse_buttons():
return (int(input('>>').lower()=='y'), 0, 0)
当你决定是否按下鼠标按钮时(通过键入Y/Y),结果是你的去盎司代码——尽管笨重的代码确实做了预期的事情——当你最初键入“Y”或从非“Y”变为“Y”时,你的循环只打印1——即你的代码正确地检测到了从未按下变为按下的初始变化
由于您声明代码不起作用,因此很明显,怀疑您的get_mouse_buttons()函数——您声称该函数工作正常。您能告诉我们该函数的预期结果吗?还有什么不正常(意外返回?错误?)谢谢!很抱歉,缺少信息,我对其进行了更精确的编辑。db的起始值是什么?只是形式完整性?实际上,在将函数get\u mouse\u buttons()
替换为def get\u mouse\u buttons():return[int(input())]
用输入模拟点击。@hemcab-这表明get\u mouse\u buttons()
没有达到预期效果。问题是,当db已经为1时,他希望将var返回为0-即忽略继续按下的按钮。在这种情况下,他希望第一个参数返回0。这样就可以了。注意,我交换了返回值的顺序。他的主程序中的db
必须是上次实际按下按钮的记忆。这在debounce
中作为var
出现。你是对的-我没有发现你交换了db和var的值。非常清楚地将其作为一个逻辑表,但我认为它确实产生了:如果var=0
,那么它会经历第二个条件,使var保持在0,db设置为0,因此它返回(0,0)
。如果var=1
和db=0
,我们处于第一个条件,当db变为0时,它返回(1,1)
。最后,如果var=1
和db=1
,我们处于第三个条件,当var设置为0时,它返回(0,1)
。我错过什么了吗?它应该会给出正确的结果。@HenriChab-也许我当时对多个ifs的分析是错误的-我更喜欢逻辑而不是嵌套的AND。你的解决方案肯定更好!但我试图理解为什么他的解决方案不起作用work@HenriChab正如您所建议的-当您使用input
时,它确实起作用,因此(正如我在其他注释链中提到的)建议get\u mouse\u butions()
不起作用。