6

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 の値が失われます。

これらを連携させる方法はありますか?

4

1 に答える 1

1

質問は非常に古いようです...しかし、それは十分に注目を集めたので、私の答えを残しておくことにしました..ここのサイトをチェックして、疑問を解消してください..

更新:この回答は、元の質問者からの要点にリンクしています。リンクをたどらなければならない人を救うために...ここに完全なコードがあります:

#!/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)
于 2017-01-03T14:02:48.210 に答える