web-dev-qa-db-ja.com

pythonを使用した動的端末印刷

Hellanzbのような特定のアプリケーションには、top()のような動的に更新されるデータの外観で端末に印刷する方法があります。

これを行うためのpython?提案も私は彼らに開かれています。

35
Recursion

1行のみを更新する必要がある場合(たとえば、進行状況バーを作成する場合)の最も簡単な方法は、'\r'(キャリッジリターン)とsys.stdoutを使用することです。

import sys
import time

for i in range(10):
    sys.stdout.write("\r{0}>".format("="*i))
    sys.stdout.flush()
    time.sleep(0.5)

ポインターの移動などをサポートする適切なコンソールUIが必要な場合は、標準ライブラリの curses モジュールを使用します。

import time
import curses

def pbar(window):
    for i in range(10):
        window.addstr(10, 10, "[" + ("=" * i) + ">" + (" " * (10 - i )) + "]")
        window.refresh()
        time.sleep(0.5)

curses.wrapper(pbar)

curses.wrapper 関数を使用してメイン関数を呼び出すことを強くお勧めします。エラーが発生した場合は端末のクリーンアップを処理するため、使用できない状態にはなりません。その後。

より複雑なUIを作成する場合、画面のさまざまな部分、テキスト入力ボックス、およびマウスサポート用に複数のウィンドウを作成できます。

52
Torsten Marek

ほとんどの答えがすでに述べているように、Linuxではncursesを使用する以外に選択肢はほとんどありません。しかし、Linuxを使用していない場合、または端末UIを作成するためにもう少し高度なものが必要な場合はどうでしょうか。

個人的には、Pythonイライラすることで、最新のクロスプラットフォームターミナルAPIがないことを発見したので、これを解決するために asciimatics を書きました。 シンプルなクロスプラットフォームAPIIウィジェットとアニメーション の上位レベルの抽象化も多数提供します。これらは、トップライクなUIを簡単に作成できます。

14
Peter Brittain

cursesの仕事のように思えます。これは、テキストモードの画面レイアウトと管理に最も一般的に使用されるライブラリです。 Pythonは、パネルのサポートを含む、cursesの非常に優れたサポートを備えています。

3
gavinb

cursesを使用してこのスクリプトをハッキングしました。本当にアドホックなソリューションで、私は楽しみのためにやった。スクロールはサポートしていませんが、端末上に複数の行があるライブ更新モニターを構築しようとしている場合、良い出発点だと思います。

https://Gist.github.com/tpandit/b2bc4f434ee7f5fd890e095e79283aec

2
tejas pandit

属性「end」を使用すると、print()コマンドを介して端末に出力を送信するときに、スクロールせずに実行できます。

デフォルトはend = '\ n'で、これは新しい行です。

スクロールを抑制し、前の行全体を上書きするには、 '\ r'であるRETURNエスケープを使用できます。

最後の4文字のみを書き換えたい場合は、いくつかのバックスペースを使用できます。

print(value, "_of_", total, end='\r')

[〜#〜] note [〜#〜]これは標準システム端末で機能します。 IDLEのような一部のツールのターミナルエミュレーターにはエラーがあり、「\ r」が適切に機能せず、出力は単に印刷不能な文字で連結されます。

print()のボーナス情報上記の例では、「of」の両側のスペースは、値と「of」の単語の間の空白を保証するためのものです。ただし、print()のデフォルトの区切り文字は ""(スペース)であるため、 "_ of_"の値とアンダースコアの間に空白ができます。

>> print (value, "_of_", total, end='\r')
8 _of_ 17

Sepparator属性sepは、印刷されるアイテム間に文字を設定するために使用できます。私の例では、出力を自分のニーズに合うようにヌル文字列( '')に変更します。

>> print (value, "_of_", total, sep='', end='\r')
8_of_17
1
GT Electronics

Unixのシェルスクリプトでこれを行う場合、明確なプログラムを使用する傾向があります。 Pythonサブプロセスモジュールを使用して実行できます。少なくとも、探しているものをすばやく取得できます。

0
Omnifarious