2016-09-26 9 views
2

簡略化するために、私はPythonでコマンドライン双方向チャットを書くつもりです。ユーザーにコマンドプロンプトでinput()と入力してもらいたいですが、リスニングスレッドはいつでもメッセージを出力できます。デフォルトでは、これはユーザーの入力を「中断」します。このような視覚的な何か:端末に同時に出力するときにユーザーの入力をそのまま維持する

userB>Stop interuserA wrote:Hey check this out! 
rupting me! 

は、私が見つけることができた最も近いがないまさに、私が探しているものをほとんどですが、this answer hereだったが、それは何であると思わblessingsパッケージの方に私をポイントでした私は必要です(しかし、私はすべてのパッケージ、または純粋なANSIIの答えに満足しています)。

私が達成しようとしているのは、より上の受信出力をユーザの入力であるより上に印刷して、テキストが壊れないようにすることです。のは、ユーザーが入力しているとしましょう:

userB>Stop inter 

が突然メッセージがスレッドから入ってきたが、私たちのユーザーの入力がブレーキされていません。私のスレッド理論print_incoming_message()方法を達成するためにどのように見えるか

userA says: Ok I won't interrupt you 
userB>Stop inter 

この?

注:私はLinuxを使用しており、プラットフォーム間の互換性には関心がありません。

答えて

1

これには2通りの方法があります。

ncursesのいずれかを使用します。これにはPythonバインディングがあります。 ncursesを使用すると、端末の画面が完全に制御され、いつでも文字を印刷できます。

ncursesを指定しないと、現在の行の上に書き込むことはできません。ただし、となりますが、\rという文字が印刷され、行頭に戻ります。

あなたは(彼はfooを書いたと言う)は、ユーザーの入力を保存し、あなたがその上にラインbarを印刷したい場合は、あなたが出力できます:

\rbar\nfoo 

これは、現在の行を上書きし、改行を紹介しますユーザーの入力を下に移動します。その効果は似ていますが、改ざん防止にはncursesとはなりません。

+0

ありがとうございました。上書きする前に自分でユーザーの入力を追跡する必要があるのですか、または「現在の入力を保存する」と言う方法がありますか?つまり、まだフラッシュされていない入力を得る方法はありますか? – Juicy

+0

入力された最後の改行から入力を追跡する必要があります。 – slezica

+1

'get_line_buffer()'メソッドを持つ 'readline'モジュールが見つかりました。これまでのところうまくいっています!正しい方向に私を指してくれてありがとう。 https://docs.python.org/3/library/readline.html#module-readline – Juicy

関連する問題