在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 的值。

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

请您参考如下方法:

这个问题似乎很老了...但它引起了足够的关注,所以我想留下我的答案...你可以查看网站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) 


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!