Python Curses

17906 ワード

  • 部分転載:python curses使用
  • pythonlab
  • pythonlabカラー端末
  • 公式API
  • かわいいPython:Cursesプログラミング
  • 概要
  • pythonではcursesがc言語のcursesをカプセル化し、addstr()、mvaddstr()、mvwaddstr()などのcでのレプリケーション部分を単純化してaddstr()メソッド
  • に統合した.
    文法入門
    cursesアプリケーションのオンとオフ
  • は、コードの実行前にcursesを初期化します.初期化操作はinitscr()関数を呼び出し、以下のようにします.この関数は、異なるデバイスに基づいて1つのwindowオブジェクトが画面全体を表すことを返します.このwindowオブジェクトは通常stdscrと呼ばれ、c言語のエラーと一致します.
  • import curses stdscr = curses.initscr()
  • cursesを使用すると、通常、読み取り文字が適切な環境でのみ出力されることを目的として画面が閉じられます.これにはnoecho()メソッド
  • を呼び出す必要がある.
    curses.noecho()
  • アプリケーションは、通常、cbreakモードと呼ばれ、逆に一般的に使用されるモードはバッファ入力モードである.オープン即時cbreakモードコードは以下の通りです.
  • curses.cbreak()
  • 端末は、カーソルキーやPage UPやHomeキーなどのナビゲーションキーのようなマルチバイトのエスケープシーケンスとして、特殊なキーを返すことが多い.cursesは、cursesのようなこれらのシーケンスについて一度処理することができる.KEY_LEFTは特殊な値を返します.これらの作業を完了するには、キーボードモードをオンにする必要があります.
  • stdscr.keypad(1)
  • cursesを閉じるのは簡単です.
  • です.
    curses.nocbreak()#        (          )
    stdscr.keypad(0)
    curses.echo() #        
  • endwin()を呼び出してデフォルト設定
  • を復元
    curses.endwin()
  • cursesをデバッグする際によくある問題は、cursesアプリケーションが終了した後、端末を以前の状態にリセットせず、端末をめちゃくちゃにしたことです.pythonでは,この問題はコードにバグがあり,送信異常に起因することが多い.例えば、キーボードが文字をたたくと画面が表示されなくなり、shellが非常に使いにくくなります.
  • このような問題を回避するためにcursesを導入することができる.wrapperモジュール.この関数は、上記と色の初期化を含むいくつかの初期化作業を行います.次に、指定した関数を実行し、最後にリセットします.呼び出された関数はtry-catchに書かれています.

  • 新しいウィンドウとpadを開く
  • は、通常、initscr()を呼び出して、すべての画面を表すwindowオブジェクトを取得する.しかし、多くのプログラムでは、スクリーンをいくつかの小さなウィンドウに分割したいと考えています.再描画のために、これらの作業は小さなウィンドウで独立して行われます.newwin()関数は、新しいウィンドウを作成するために使用され、ウィンドウサイズを指定し、新しいwindowオブジェクトを返す必要があります.
  • begin_x = 20;
    begin_y = 7;
    height = 5;
    width = 40;
    win = curses.newwin(height, width, begin_y, begin_x)
  • 注意:座標通過はy後xである.これは他の座標系とは違いますが、根強く、書くときはこのままでは遅すぎます.
  • テキストを表示または消去する方法を呼び出すと、効果はすぐに表示されません.スクリーンの再描画時間を減らすために、cursesはまずこれらの操作を蓄積し、より効果的な方法で表示します.たとえば、プログラムがウィンドウにいくつかの文字を表示してから画面を消去すると、初期文字を送信する必要はありません.表示されないからです.
  • そのため、cursesはrefresh()関数を使用してウィンドウの再描画を明確に指摘する必要があります.
  • padはwindowの特例です.padは表示される画面よりも大きく、padの一部だけを一度に表示することができます.padを作成するのは簡単で、幅を広くするだけでいいです.しかしpadをリフレッシュするには、画面に表示されるpadの一部の座標を提供する必要があります.
  • pad = curses.newpad(100, 100)
    #  These loops fill the pad with letters; this is# explained in the next sectionfor y in range(0, 100):
    for x in range(0, 100):
        try:
            pad.addch(y,x, ord('a') + (x*x+y*y) % 26)
        except curses.error:
            pass#  Displays a section of the pad in the middle of the screenpad.refresh(0,0, 5,5, 20,75)
  • は同時に複数のwindowまたは複数のpadで、あるwindowまたはpadをリフレッシュすると画面が点滅するという問題があります.
  • 点滅を避ける方法:各windowでnoutrefresh()メソッドを呼び出す.次にrefresh()メソッドの最後にdoupdate()メソッドを呼び出します.

  • テキストの表示
  • addscrの異なるフォーマットは、座標がない場合、前回の操作が完了した位置に文字が表示されます.
  • Form                        Description
    str or ch                   Display the string str or character ch at the current position
    str or ch, attr             Display the string str or character ch, using attribute attr at the current position
    y, x, str or ch             Move to position y,x within the window, and display str or ch
    y, x, str or ch, attr       Move to position y,x within the window, and display str or ch, using attribute attr
  • プロパティを使用すると、テキストをハイライト表示できます.たとえば、黒、下線、逆順序、カラー表示などです.

  • 属性と色
  • プロパティと説明:
  • Attribute       Description
    A_BLINK         Blinking text
    A_BOLD          Extra bright or bold text
    A_DIM           Half bright text
    A_REVERSE       Reverse-video text
    A_STANDOUT      The best highlighting mode available
    A_UNDERLINE     Underlined text
  • 画面の最初の行reverse-videoが表示されます.
  • stdscr.addstr(0, 0, "Current mode: Typing mode", curses.A_REVERSE)
    stdscr.refresh()
  • cursesフロントシーンとバックグラウンドカラーを使用し、color_pair()メソッドは、一対の色を取得します.
  • 色対1で1行
  • を表示する.
    stdscr.addstr("Pretty text", curses.color_pair(1))
    stdscr.refresh()
  • start_color()は8つの基本色:0:black,1:red,2:green,3:yellow,4:blue,5:magenta,6:cyan,and 7:whiteを初期化した.
  • init_pair(n,f,b)色対nを修正し,fを前景色,bを背景色とする.色は0生まれつきの白黒に対して、変えることは許されません.
  • 例えば、color 1を赤色テキストに変更し、白色背景:
  • curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE)
  • 使用:
  • stdscr.addstr(0,0, “RED ALERT!”, curses.color_pair(1))

  • ユーザー入力
  • は、ユーザの入力待ちを一時停止し、echo()メソッドを表示するgetch()メソッドを使用して入力を取得する.
  • getch()は、入力文字のASCII値を表す0~255の整数を返します.印刷255は、Page Up、Homeなどの特殊な文字です.
  • コードはよく
  • と書きます.
    while 1:
        c = stdscr.getch()
        if c == ord('p'):
            PrintDocument()
        elif c == ord('q'):
            break# Exit the while()elif c == curses.KEY_HOME:
            x = y = 0
  • getstr()は文字列を取得します.機能が限られているのでよく使われません.
  • curses.echo() # Enable echoing of characters# Get a 15-character string, with the cursor on the top lines = stdscr.getstr(0,0, 15)

  • コードは次のとおりです:
  • #-*- coding: UTF-8 -*-
    import curses
    stdscr = curses.initscr()
    def display_info(str, x, y, colorpair=2):
        '''''     colorpair    '''global stdscr
        stdscr.addstr(y, x,str, curses.color_pair(colorpair))
        stdscr.refresh()
    def get_ch_and_continue():
        '''''  press any key to continue'''global stdscr
        #  nodelay, 0          stdscr.nodelay(0)
        #       ch=stdscr.getch()
        #  nodelay,                     ,  1  stdscr.nodelay(1)
        return True
    def set_win():
        '''''     '''global stdscr
        #               curses.start_color()
        #        ,     color pair,   1 2 curses.init_pair(1, curses.COLOR_GREEN, curses.COLOR_BLACK)
        curses.init_pair(2, curses.COLOR_RED, curses.COLOR_BLACK)
        #       curses.noecho()
        #           curses.cbreak()
        #  nodelay,                     ,  1  stdscr.nodelay(1)
    def unset_win():
        '''     '''global stdstr
        #         (    ,            ,           ) curses.nocbreak()
        stdscr.keypad(0)
        curses.echo()
        #     curses.endwin()
    if__name__=='__main__':
        try:
            set_win()
            display_info('Hola, curses!',0,5)
            display_info('Press any key to continue...',0,10)
            get_ch_and_continue()
        except Exception,e:
            raise e
        finally:
            unset_win()
  • 実行:#python testcurses.py

  • 列を間違える
    [root@yl-web-test srv]# python curses.pyTraceback (most recent call last):
      File "curses.py", line 2, in <module>
        import curses
      File "/srv/curses.py", line 4, in <module>    stdscr = curses.initscr()
    AttributeError: 'module' object has no attribute 'initscr'
  • 理由:私のファイルの名前がcursesだからです.py、システムもcursesを使っています.py,pythonは実行時に現在のディレクトリから検索するので、システムファイルと名前を変更することはできません.
  • 名前を変えて、例えばtestcursesと名前を変えます.pyでいいです.

  • 小例
  • PythonでNcursesを使用します.次は小さなルーチン
  • です.
    import curses
    myscreen = curses.initscr()
    myscreen.border(0)
    myscreen.addstr(12, 25, "Python curses in action!")
    myscreen.refresh()
    myscreen.getch()
    curses.endwin()
  • この例の最初の行import cursesは、cursesライブラリが使用されていることを示し、その後、このイメージは画面の真ん中に「Python curses in action!」を出力することに注意する.文字、
  • 座標が12,25である場合、80 x 25は、画素
  • ではなく文字を用いる画面サイズであることに留意されたい.
  • デジタルメニューの例
  • を見てみましょう
    #!/usr/bin/env python
    from os import system
    import curses
    def get_param(prompt_string):
        screen.clear()
        screen.border(0)
        screen.addstr(2, 2, prompt_string)
        screen.refresh()
        input = screen.getstr(10, 10, 60)
        return input
    def execute_cmd(cmd_string):
        system("clear")
        a = system(cmd_string)
        print ""
        if a == 0:
            print "Command executed correctly"
        else:
            print "Command terminated with error"
        raw_input("Press enter")
        print ""
    x = 0
    while x != ord('4'):
        screen = curses.initscr()
        screen.clear()
        screen.border(0)
        screen.addstr(2, 2, "Please enter a number...")
        screen.addstr(4, 4, "1 - Add a user")
        screen.addstr(5, 4, "2 - Restart Apache")
        screen.addstr(6, 4, "3 - Show disk space")
        screen.addstr(7, 4, "4 - Exit")
        screen.refresh()
        x = screen.getch()
        if x == ord('1'):
            username = get_param("Enter the username")
            homedir = get_param("Enter the home directory, eg /home/nate")
            groups = get_param("Enter comma-separated groups, eg adm,dialout,cdrom")
            shell = get_param("Enter the shell, eg /bin/bash:")
            curses.endwin()
            execute_cmd("useradd -d " + homedir + " -g 1000 -G " + groups + " -m -s " + shell + " " + username)
        if x == ord('2'):
            curses.endwin()
            execute_cmd("apachectl restart")
        if x == ord('3'):
            curses.endwin()
            execute_cmd("df -h")
    curses.endwin()