Python - 从 While 循环结束后返回
Python - returning from a While Loop after its end
我正在尝试为 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()
我猜默认值可变变量是那个要了你的命。在这里查看:http://docs.python-guide.org/en/latest/writing/gotchas/#mutable-default-arguments。
我什至不明白为什么在这种情况下你需要一个列表变量,为什么不直接使用 n=0 而不必使用列表?
也许创建一个新的全局变量或class来封装两个state-related变量(stop_loop和n)。喜欢:
loop = dict(stop=False, n=0)
现在您将此而不是 stop_loop 传递给 main_menu。
或者使用 class 为菜单封装一个圆形数组,例如:
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()
我正在尝试为 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()
我猜默认值可变变量是那个要了你的命。在这里查看:http://docs.python-guide.org/en/latest/writing/gotchas/#mutable-default-arguments。
我什至不明白为什么在这种情况下你需要一个列表变量,为什么不直接使用 n=0 而不必使用列表?
也许创建一个新的全局变量或class来封装两个state-related变量(stop_loop和n)。喜欢:
loop = dict(stop=False, n=0)
现在您将此而不是 stop_loop 传递给 main_menu。
或者使用 class 为菜单封装一个圆形数组,例如:
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()