如何在Python curses中创建菜单和子菜单?

如何在Python curses中创建菜单和子菜单?,第1张

如何在Python curses中创建菜单和子菜单?

我真的建议您考虑使用面板。每当您有可能重叠的小部件时,它都会使生活更轻松。这是一个简单的示例,应该可以帮助您入门。(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然后启动,以防止对终端设置造成任何干扰。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5654244.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存