运行简单shell脚本的Python文本菜单

运行简单shell脚本的Python文本菜单,python,shell,menu,raspberry-pi,Python,Shell,Menu,Raspberry Pi,我不知道该怎么做,所以我不知道从哪里开始 基本上,我想编写一个python脚本,为用户提供一个项目列表,可以使用箭头键和enter键进行切换和选择。如果python不能做到这一点,还有其他语言可以做到吗 然后,所做的选择将运行一行简单的shell脚本(用raspbian语言) 我的想法是,我将使用这个列表,列出我的树莓pi将使用MAME运行的游戏。i、 这是一种选择游戏的简单方法,而不是每次都写一行代码 干杯你会想看看诅咒。在谷歌上搜索教程,例如。 这是一个很好的库,可以创建您在这里描述的接口

我不知道该怎么做,所以我不知道从哪里开始

基本上,我想编写一个python脚本,为用户提供一个项目列表,可以使用箭头键和enter键进行切换和选择。如果python不能做到这一点,还有其他语言可以做到吗

然后,所做的选择将运行一行简单的shell脚本(用raspbian语言)

我的想法是,我将使用这个列表,列出我的树莓pi将使用MAME运行的游戏。i、 这是一种选择游戏的简单方法,而不是每次都写一行代码


干杯

你会想看看
诅咒
。在谷歌上搜索教程,例如。 这是一个很好的库,可以创建您在这里描述的接口

运行简约GUI时,使用
子流程
-模块启动脚本,例如

import subprocess
subprocess.call(["my_script.sh","parameter1","parameter2"])
编辑

似乎诅咒不支持可选列表,但ncurses支持。在Debian存储库中,有一些到ncurses的python绑定

例如:

import urwid
import subprocess

games = {"Game1":"script_name1.sh",
         "Game2":"script_name2.sh",
         "Game3":"script_name3.sh",
         "Game4":"script_name4.sh",
         "Game5":"script_name5.sh",}

class ItemWidget (urwid.WidgetWrap):

    def __init__ (self, id, description):
        self.id = id
        self.content = description
        self.item = [
            ('fixed', 15, urwid.Padding(urwid.AttrWrap(
                urwid.Text('%s:' % str(id)), 'body', 'focus'), left=2)),
            urwid.AttrWrap(urwid.Text('%s' % description), 'body', 'focus'),
        ]
        w = urwid.Columns(self.item)
        self.__super.__init__(w)

    def selectable (self):
        return True

    def keypress(self, size, key):
        return key

def main ():
    palette = [
        ('body','dark cyan', '', 'standout'),
        ('focus','dark red', '', 'standout'),
        ('head','light red', 'black'),
        ]

    def keystroke (input):
        if input in ('q', 'Q'):
            raise urwid.ExitMainLoop()

        if input is 'enter':
            view.set_header(urwid.AttrWrap(urwid.Text("selected"), 'head'))
            focus = listbox.get_focus()[0].content
            try:
                subprocess.call(games[focus])
            except OSError, ose:
                view.set_header(urwid.AttrWrap(urwid.Text(
                    'error starting %s: %s' % (str(focus), str(ose))), 'head'))

    items = []
    game_keys = sorted(games.keys())
    for i, k in enumerate(game_keys):
        items.append(ItemWidget(i, k))

    header = urwid.AttrMap(urwid.Text('selected:'), 'head')
    listbox = urwid.ListBox(urwid.SimpleListWalker(items))
    view = urwid.Frame(urwid.AttrWrap(listbox, 'body'), header=header)
    loop = urwid.MainLoop(view, palette, unhandled_input=keystroke)
    loop.run()

if __name__ == '__main__':
    main()

这是改编自。

您可能想看看
诅咒。在谷歌上搜索教程,例如。
这是一个很好的库,可以创建您在这里描述的接口

运行简约GUI时,使用
子流程
-模块启动脚本,例如

import subprocess
subprocess.call(["my_script.sh","parameter1","parameter2"])
编辑

似乎诅咒不支持可选列表,但ncurses支持。在Debian存储库中,有一些到ncurses的python绑定

例如:

import urwid
import subprocess

games = {"Game1":"script_name1.sh",
         "Game2":"script_name2.sh",
         "Game3":"script_name3.sh",
         "Game4":"script_name4.sh",
         "Game5":"script_name5.sh",}

class ItemWidget (urwid.WidgetWrap):

    def __init__ (self, id, description):
        self.id = id
        self.content = description
        self.item = [
            ('fixed', 15, urwid.Padding(urwid.AttrWrap(
                urwid.Text('%s:' % str(id)), 'body', 'focus'), left=2)),
            urwid.AttrWrap(urwid.Text('%s' % description), 'body', 'focus'),
        ]
        w = urwid.Columns(self.item)
        self.__super.__init__(w)

    def selectable (self):
        return True

    def keypress(self, size, key):
        return key

def main ():
    palette = [
        ('body','dark cyan', '', 'standout'),
        ('focus','dark red', '', 'standout'),
        ('head','light red', 'black'),
        ]

    def keystroke (input):
        if input in ('q', 'Q'):
            raise urwid.ExitMainLoop()

        if input is 'enter':
            view.set_header(urwid.AttrWrap(urwid.Text("selected"), 'head'))
            focus = listbox.get_focus()[0].content
            try:
                subprocess.call(games[focus])
            except OSError, ose:
                view.set_header(urwid.AttrWrap(urwid.Text(
                    'error starting %s: %s' % (str(focus), str(ose))), 'head'))

    items = []
    game_keys = sorted(games.keys())
    for i, k in enumerate(game_keys):
        items.append(ItemWidget(i, k))

    header = urwid.AttrMap(urwid.Text('selected:'), 'head')
    listbox = urwid.ListBox(urwid.SimpleListWalker(items))
    view = urwid.Frame(urwid.AttrWrap(listbox, 'body'), header=header)
    loop = urwid.MainLoop(view, palette, unhandled_input=keystroke)
    loop.run()

if __name__ == '__main__':
    main()
这是改编自