我不知道该怎么做,所以我不知道从哪里开始。
基本上,我想编写一个 python 脚本,它将向用户显示一个项目列表,这些项目可以使用箭头键和 Enter 键进行切换和选择。如果 python 不能做到这一点,还有另一种语言可以吗?
然后所做的选择将运行一行简单的 shell 脚本(在 raspbian 中)
我的想法是,我将使用我的树莓派将使用 MAME 运行的游戏列表。即一种很好的简单选择游戏的方法,而不是每次都在代码行中编写。
干杯
我不知道该怎么做,所以我不知道从哪里开始。
基本上,我想编写一个 python 脚本,它将向用户显示一个项目列表,这些项目可以使用箭头键和 Enter 键进行切换和选择。如果 python 不能做到这一点,还有另一种语言可以吗?
然后所做的选择将运行一行简单的 shell 脚本(在 raspbian 中)
我的想法是,我将使用我的树莓派将使用 MAME 运行的游戏列表。即一种很好的简单选择游戏的方法,而不是每次都在代码行中编写。
干杯
你会想看看curses
。在Google 上搜索教程,例如,这里。这是一个很好的库,可以创建您在此处描述的界面。
当您运行简约的 GUI 时,使用subprocess
-module 启动脚本,例如
import subprocess
subprocess.call(["my_script.sh","parameter1","parameter2"])
编辑
似乎 curses 不支持可选列表,但 ncurses 支持。在 Debian 存储库中,有python-urwid
一些 Python 绑定到 ncurses。
一个例子是:
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()
这是改编自nicosphere。