[英]Python text menu that runs simple shell script
我不知道如何 go 关于这个所以我不知道从哪里开始。
基本上我想编写一个 python 脚本,它将向用户显示一个项目列表,可以使用箭头键和回车键切换和选择这些项目。 如果 python 不能做到这一点,是否有另一种语言可以做到?
所做的选择将运行一行简单的 shell 脚本(在 raspbian 中)
我的想法是,我将使用我的树莓派将使用 MAME 运行的游戏列表。 即选择游戏的一种很好的简单方法,而不是每次都在代码行中编写。
干杯
你想看看curses
。 在Google上搜索教程,例如, 在这里 。 如您在此处所述,创建界面是一个很好的库。
当您运行简约GUI时,使用subprocess
进程 - 模块来启动脚本,例如
import subprocess
subprocess.call(["my_script.sh","parameter1","parameter2"])
编辑
好像curses不支持可选列表,但ncurses确实如此。 在Debian存储库中,有一些python-urwid
,一些与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()
这是改编自nicosphere 。
您需要在第 45 行将“,”更改为“as”以使其在 python 3.10 工作:
except OSError as ose:
view.set_header(urwid.AttrWrap(urwid.Text(
'error starting %s: %s' % (str(focus), str(ose))), 'head'))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.