0

我正在尝试在 python 中为闹钟编写一个菜单例程,它根据通过按钮的一些输入在 7 段显示器上显示相关信息。我设法创建了一个显示当前时间的循环,当单击“debMenu”按钮时,将显示 3 个菜单选项。这仅在第 3 次之前效果很好。到达菜单选项。当我再次按下按钮时,例程不起作用 - 因此不再调用函数“main_menu”。我做错了什么...?谢谢 !!

stop_loop = [False]

def main_menu(stop_loop, n=[0]):
    stop_loop[0] = True
    debSelect = DebouncedSwitch(butSelect, cbButSelect, "butSelect")
    menuList = ['HO  ', 'AL  ', 'UP  ']

    if n[0] < 3:
        display.scroll(menuList[n[0]], 200) #display menu on 7-seg display
        display.show(menuList[n[0]])
        n[0] += 1

    elif n[0] == 3:
        n=[0]
        stop_loop[0] = False

    main()

def main():
    stop_loop[0] = False
    debMenu = DebouncedSwitch(butMenu, main_menu, stop_loop)
    while not stop_loop[0]: # display current time on 7-seg display
        curTime = rtc.datetime()
        display.numbers(curTime.hour, curTime.minute, False)
        time.sleep_ms(500)
        display.numbers(curTime.hour, curTime.minute)
        time.sleep_ms(500)

main()
4

1 回答 1

0

我猜默认值可变变量是杀死你的变量。在这里查看:http: //docs.python-guide.org/en/latest/writing/gotchas/#mutable-default-arguments

我什至不明白为什么在这种情况下你需要一个列表变量,为什么不只是 n=0 而不必使用列表?

可能会创建一个新的全局变量或类来封装与状态相关的变量(stop_loop 和 n)。喜欢:

loop = dict(stop=False, n=0)

现在你将它而不是 stop_loop 传递给 main_menu。

或者使用一个封装了一个圆形数组的类,例如:

class LoopMenu:
   """ circular array menu list with pause/continue/next"""

   def __init__(self, menu):
       self.menu = menu
       self.stop = False
       self.n = 0

   def next(self):          
       menu = self.menu[self.n]
       self.n += 1
       if self.n > len(self.menu):
           self.n = 0
       return menu

    def pause(self):
        self.stop = True

    def play(self):
        self.stop = False

那么你的 main_menu 方法可能是:

my_menu_loop = LoopMenu(['HO  ', 'AL  ', 'UP  '])

def main_menu(menu_loop):
    menu_loop.pause()
    debSelect = DebouncedSwitch(butSelect, cbButSelect, "butSelect")

    menu = menu_loop.next()
    display.scroll(menu, 200) #display menu on 7-seg display
    display.show(menu)

    main()

def main():
    my_menu_loop.play()
    debMenu = DebouncedSwitch(butMenu, main_menu, my_menu_loop)
    while not loop_menu.stop: # display current time on 7-seg display
        curTime = rtc.datetime()
        display.numbers(curTime.hour, curTime.minute, False)
        time.sleep_ms(500)
        display.numbers(curTime.hour, curTime.minute)
        time.sleep_ms(500)

main()
于 2018-03-08T19:46:54.830 回答