Ответ 1
Я действительно рекомендую вам изучить панели . Каждый раз, когда у вас будут виджеты, которые могут пересекаться, это делает жизнь намного проще. Это простой пример, который должен вас начать. (Ни curses.beep(), ни curses.flash(), похоже, работают на моем терминале, но это не относится к точке)
#!/usr/bin/env python2
import curses
from curses import panel
class 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(вызываемого) для запуска вашего приложения более чистое, чем выполнение вашей собственной попытки/исключение с помощью очистки.
Ваш класс дважды вызывает initscr, который, вероятно, будет генерировать два экрана (не проверено, если он вернет тот же экран, если его настройка), а затем, когда у вас есть несколько меню, нет правильной обработки (что должно быть) разных окон/экранов, Я думаю, что его более ясная и лучшая бухгалтерская система передаст меню на экран, который будет использоваться, и позвольте меню сделать подокно для отображения, как в моем примере.
Именование списка "Список" - отличная идея.
Если вы хотите запустить другое приложение терминала, например "top", возможно, лучше сначала вывести cython python, а затем запустить, чтобы предотвратить любые попытки с помощью настроек терминала.