Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么这个去盎司功能不起作用?_Python_Button_Debounce - Fatal编程技术网

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()
不起作用。