我真的建议您考虑使用面板。每当您有可能重叠的小部件时,它都会使生活更轻松。这是一个简单的示例,应该可以帮助您入门。(curses.beep()或curses.flash()似乎都不能在我的终端上正常工作,但这不重要)
#!/usr/bin/env pythonimport cursesfrom curses import panelclass Menu(object): def __init__(self, items, stdscreen): self.window = stdscreen.subwin(0, 0) self.window.keypad(1) self.panel = panel.new_panel(self.window) self.panel.hide() panel.update_panels() self.position = 0 self.items = items self.items.append(("exit", "exit")) def navigate(self, n): self.position += n if self.position < 0: self.position = 0 elif self.position >= len(self.items): self.position = len(self.items) - 1 def display(self): self.panel.top() self.panel.show() self.window.clear() while True: self.window.refresh() curses.doupdate() for index, item in enumerate(self.items): if index == self.position: mode = curses.A_REVERSE else: mode = curses.A_NORMAL msg = "%d. %s" % (index, item[0]) self.window.addstr(1 + index, 1, msg, mode) key = self.window.getch() if key in [curses.KEY_ENTER, ord("n")]: if self.position == len(self.items) - 1: break else: self.items[self.position][1]() elif key == curses.KEY_UP: self.navigate(-1) elif key == curses.KEY_DOWN: self.navigate(1) self.window.clear() self.panel.hide() panel.update_panels() curses.doupdate()class MyApp(object): def __init__(self, stdscreen): self.screen = stdscreen curses.curs_set(0) submenu_items = [("beep", curses.beep), ("flash", curses.flash)] submenu = Menu(submenu_items, self.screen) main_menu_items = [ ("beep", curses.beep), ("flash", curses.flash), ("submenu", submenu.display), ] main_menu = Menu(main_menu_items, self.screen) main_menu.display()if __name__ == "__main__": curses.wrapper(MyApp)
查看代码时要注意的一些事情。
使用curses.wrapper(callable)启动您的应用程序比使用自己的try / except(清除 *** 作)更干净。
您的类调用了initscr两次,这可能会生成两个屏幕(如果对其进行设置,如果返回了相同的屏幕,请进行测试,然后进行测试),然后当您具有多个菜单时,就无法正确处理(应该是)不同的窗口/屏幕。我认为通过菜单使用屏幕并让菜单成为一个子窗口来显示更清晰,更好的簿记,如我的示例所示。
命名列表
'list'不是一个好主意,因为它遮盖了
list()函数。
如果您要启动另一个终端应用程序(例如“ top”),最好先让python干净退出curses然后启动,以防止对终端设置造成任何干扰。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)