Текущая поделка сослуживца представляла из себя пластилиновый шарик плотно слепленных и переплетенных друг с другом частей. Поэтому, что-либо изменить, дополнить или на худой конец понять, в том коде я не смог, поэтому решил переписать данную балалайку, предварительно разделив архитектурные компоненты. Пошел в Сеть на поиски python-фреймворка для построения консольных менюшек. Поиски не увенчались успехом — не нашлось просто в Сети фреймворков для построение хотя бы мало-мальски пригодного к использованию меню. Но вот нашел двух " почти кандидатов": cliff не совсем соответствует моим запросам т.к. это не консольное меню, собственно, а просто интерактивный сеанс (командная строка) в которой возможно руками вводить команды и наслаждаться автодополнением. Не то. console совсем не соответствует желаниям т.к. это
тот же сыр, но под другим соусом
Тем более, более чем сырой. Простите за тафталогию.
Начать я, собственно, решил с написания пары классов для отрисовки консольного меню (основу отрисовки услужливо предоставил мне модуль cmd2, который, как следствие требуется для работы с моим маленьким xmenu). Собственно в реализации никаких хитростей нет. Тройка классов, корутина для хранения истории — вот и весь сказ. Получился вот такой мини-фреймворк. Прошу не начинать сразу плеваться, т.к. призываю Вас знать, что это pre-alpha версия. А забрать и посмотреть xmenu можно на гитхабе. А тем, кому не хочется разбираться в отсутствующей докуметации (пока, отсутствующей), опубликую пример клиентского кода вот здесь:
# -*- coding: utf-8 -*- import sys from pymenu import Item, Menu, App class Twitter(Item): ''' This is twitter''' def __call__(self): sys.stdout.write('{0}\n'.format(self.name)) class Multiplier(Item): ''' Printing 1. Forever 1.''' def __call__(self): sys.stdout.write('Lorem ipsum Labor Excepteur ea ut.') def func(): ''' I am a function. Tasty and fragrand.''' print 'This is it.' class MyApp(App): ''' This is my App''' def __init__(self): menu = Menu(name='Main menu') menu.add(Twitter(name='Project run'), color='red') menu.add(Twitter(name='Other')) math = Menu(name='Math') math.add(Multiplier(name='Multi'), color='underline') inc_menu = Menu(name='Database') inc_menu.add(math) inc_menu.add(Twitter(name='Create')) inc_menu.add(Twitter(name='Drop')) menu.add(inc_menu) functinons = Menu(name='Functinons', doc='Useful functions!') functinons.add(func, name='f') menu.add(functinons, color='underline') super(MyApp, self).__init__(menu=menu, stdout=sys.stdout) def main(): MyApp().run() if __name__ == '__main__': main()
Получится вот так:
Это абсолютно хаотичное меню — по наполнению не судите.
Итак, xmenu обеспечивает:
- Меню бесконечной вложенности (меню вкладываются в меню)
- Раскрашивание элементов меню
- Возможность ходить по истории назад (в будущем быть может сделаю хождение и вперед)
- На пункты меню можно навешивать любые callable-объекты
- Xmenu автоматически собирает доки со всех объектов и аггрегирует их в одном меню — help.
Я пока не такой активный деятель движения открытого программного обеспечения, но обещаю двигаться в этом направлении, буду развивать и дополнять сей инструмент. Спасибо всем, кто дочитал до этого предложения, и особенное спасибо тем, кто затестил, высказал свои пожелания и осветил мои огрехи. И видит Хабр, быть может я не зря старался, ведь это моя первая статья и я только учусь быть хабрачеловеком.
ссылка на оригинал статьи http://habrahabr.ru/post/178819/
Добавить комментарий