我可以一起使用Python的curses和cmd库吗?

时间:2012-06-27 11:40:47

标签: python cmd curses

在Python中,我想用cmd和curses一起编写一个终端程序,即。使用cmd接受和解码完整的输入行,但使用curses定位输出。

将curses和cmd的示例混合在一起,如下所示:

import curses 
import cmd

class HelloWorld(cmd.Cmd):
    """Simple command processor example."""

    def do_greet(self, line):
        screen.clear()
        screen.addstr(1,1,"hello "+line)
        screen.addstr(0,1,">")
        screen.refresh()

    def do_q(self, line):
        curses.endwin()
        return True

if __name__ == '__main__':
    screen = curses.initscr()   
    HelloWorld().cmdloop()

我发现当我输入时我没有看到任何东西。 curses可能是在屏幕上显示任何内容之前等待刷新。我可以切换到使用getch(),但之后我将失去cmd的值。

有没有办法让这些工作在一起?

1 个答案:

答案 0 :(得分:0)

这个问题看起来很古老......但它引起了足够的注意,所以我想把我的答案留在后面......你可以查看网站here并清除你的怀疑......

更新:此答案链接到原始提问者的要点。只是为了节省必须关注链接的人...这里是完整的代码:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import curses 
import curses.textpad
import cmd

def maketextbox(h,w,y,x,value="",deco=None,textColorpair=0,decoColorpair=0):
    # thanks to http://stackoverflow.com/a/5326195/8482 for this
    nw = curses.newwin(h,w,y,x)
    txtbox = curses.textpad.Textbox(nw,insert_mode=True)
    if deco=="frame":
        screen.attron(decoColorpair)
        curses.textpad.rectangle(screen,y-1,x-1,y+h,x+w)
        screen.attroff(decoColorpair)
    elif deco=="underline":
        screen.hline(y+1,x,underlineChr,w,decoColorpair)

    nw.addstr(0,0,value,textColorpair)
    nw.attron(textColorpair)
    screen.refresh()
    return nw,txtbox

class Commands(cmd.Cmd):
    """Simple command processor example."""

    def __init__(self):
        cmd.Cmd.__init__(self)
        self.prompt = "> "
        self.intro  = "Welcome to console!"  ## defaults to None

    def do_greet(self, line):
    self.write("hello "+line)

    def default(self,line) :
    self.write("Don't understand '" + line + "'")

    def do_quit(self, line):
    curses.endwin()
        return True

    def write(self,text) :
        screen.clear()
    textwin.clear()
        screen.addstr(3,0,text)
        screen.refresh()


if __name__ == '__main__':
    screen = curses.initscr()   
    curses.noecho()
    textwin,textbox = maketextbox(1,40, 1,1,"")
    flag = False
    while not flag :
        text = textbox.edit()
    curses.beep()
    flag = Commands().onecmd(text)