【问题标题】:Python Terminal Menu? Terminal Coloring? Terminal progress display?Python终端菜单?终端着色?终端进度显示?
【发布时间】:2012-11-21 03:03:11
【问题描述】:

我有一个广泛使用 Python(2.* 风格)的项目,我想知道是否有终端菜单库或类似的东西?我希望通过使用箭头键突出显示选项、一些颜色等来简化一些选项,从而为我的脚本注入一些风味和活力。我隐约记得有一种方法可以制作 bash shell 终端菜单,但我不在确定我将如何将用户输入从 bash 传递到 python 脚本,也许有一个 bash 终端菜单用 sysargs 推送脚本调用?如果可能的话,我想要 python 方面的东西。有什么建议吗?

这也只是一个随机问题,因为我们讨论的是终端美学这个话题,所以这里很适合,处理柜台的最佳方式是什么?我的脚本查找图像文件,然后当它找到一个时,它通过子进程调用清除终端以清除,然后再次打印找到的总图像 IE 10 图像,找到一个,清除,打印“找到 11 个图像”,有时我的脚本有效真的很快,我觉得这会损害性能。想法?

非常感谢大家,我喜欢堆栈溢出;)

编辑 - 感谢所有快速回复!我有很多选择要考虑。我给了每个人一个赞成票,因为您的所有回答都很有帮助。当我回到家时,我会查看所有的图书馆,并尝试根据最佳答案选择你们中的一个作为答案,但希望我能选择你们所有人,因为你的所有答案都是相关的!非常感谢各位。下班回家后我会回来报告,并有机会编写一些代码;)

编辑 2 - 计数器/进度显示的说明,当我的脚本在很短的时间内找到数千张图像时,寻找一种方法来防止这种情况损害性能,这是真正切碎的 python...

for each item in list:
    if item ends with .jpg
        cnt=cnt+1
        do stuff with image file
        subprocess.call('clear')
        print str(cnt)+" total images processed."

再次感谢!

【问题讨论】:

  • 我不明白你在柜台部分问什么。
  • @MatthewAdams 嘿,抱歉含糊不清!基本上每次我的脚本从它正在查看的任何源中找到一个图像文件时,它都会快速执行 cnt = cnt+1,从而增加计数器。所以基本上计数器/进度显示有点像 - 请参阅编辑 2!
  • 啊。当“用图像文件做东西”绝对是其中最慢的部分时,很难谈论性能损失。如果你愿意,我想你可以尝试并行执行。
  • @MatthewAdams 它在一个文件列表中循环,如果文件名以 jpg 结尾,它会将该文件名推送到另一个列表中。事情就是这样,“mylist.append(item)”。该项目的实际处理发生在稍后。就像我说的,切碎了 python ;)
  • 哦,那并没有什么特别慢的地方,虽然每次都清屏似乎完全没有必要。

标签: python bash menu terminal


【解决方案1】:

查看 Clint (*C*指令 *L*ine *IN*接口 *T*工具)!

示例颜色:

from clint.textui import colored

print 'I love ' + colored.yellow('pyt') + colored.blue('hon')

还有缩进:

from clint.textui import colored, indent, puts

with indent(3, quote=colored.red(' >')):
    puts ('some random text')
    puts ('another text')
    with indent(3, quote=colored.green(' |')):
        puts('some more nested identation')
        puts('cool isn\'t?')

附:同一作者编写了一个类似的不错的 HTTP 请求库,名为“requests”:https://github.com/kennethreitz/requests

【讨论】:

  • 是的,非常 Pythonic 且使用自然。良好的抽象和接口。
【解决方案2】:

如果您想要大量控制并且使用 *nix,您可以使用 stdlib curses module。

如果你只是想要一点颜色(/不想修改你的脚本以适应curses),你可以使用ANSI escape codes。例如:

print '\033[1;32mgreen\033[1;m'

将打印“绿色”一词...绿色。

这是我使用回车提出的加载栏(基于this forum 中的答案):

from time import sleep 
import sys 

num = 100

print 'Loading: [%s] %d%%' % (' '*(num/2), 0),

try:
    colorCode = 43
    for x in xrange(num+1):
        if x == num: colorCode = 42
        print '\rLoading: [\033[1;%dm%s\033[1;m%s] %d%%' % (colorCode, "|"*(x/2), " "*(num/2-x/2), x), 
        sys.stdout.flush()
        sleep(0.02) # do actual stuff here instead 
except KeyboardInterrupt:
        print '\rLoading: [\033[1;41m%s\033[1;m%s] %d%%  ' % ("|"*(x/2), " "*(num/2-x/2), x)

示例输出:

Loading: [|||||||||||||||||||||||||||||||||||||||||         ] 82%

(虽然它没有显示在 SO 上,但它是彩色的 - 黄色表示加载,红色表示中止,绿色表示完成。)

【讨论】:

    【解决方案3】:

    有一个名为Urwid 的库提供菜单等。我从未将它用于严肃的目的,但根据我的初步经验,它工作得很好。它仅适用于 Un*x 系统。 (项目页面说它可以在 Cygwin 下工作,但我从未尝试过。)

    【讨论】:

    • 我从未尝试过 curses,但 Urwid 提供了一个带有信号/回调的运行循环,您需要使用 cursesAFAIK 手动设置这两者。这对于像我这样更熟悉 GUI 框架的人来说意义重大。
    • Urwid 有我正在寻找的菜单(机器人);)@uranusjr
    猜你喜欢
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    相关资源
    最近更新 更多