質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

3899閲覧

Enterなしで一文字ずつ入力をすると文字が消えてしまう。

macg3n

総合スコア60

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2020/05/10 12:44

編集2020/05/10 12:48

macを使っています。

#やりたいこと
ターミナル上でEnterキーを押さずに入力する

#問題点

sys.stdlin.read(1)

を処理するとそれより前に出力されていた文字が消えてしまうのでそうならないような方法が知りたいです。(他の部分で問題点があるのかもしれませんが、おそらくここではないかと思っています。)

例えば、ターミナル画面で、
key :[コンソール]
と出力しているつもりが、sys.stdlin.read(1) という処理をすることで上書き?されてしまい、
[コンソール]
となって、"key :"が表示されません。この時点でキー(例えばa)を一つ打つと
key : a
となって隠れていた"key :" の部分がここで現れます。

この"key :"が消える現象をなくす方法はありますか?
よろしくお願いいたします。

#コードなど
ネットで調べてみると以下のようにgetch()関数を作るとEnterキーなしで入力できることがわかりました。実際できています。

Python3

1import sys 2def getch(): 3 import tty 4 import termios 5# 標準入力のファイルディスクリプタを取得 6 fd = sys.stdin.fileno() 7# fd の端末属性を取得 8 old = termios.tcgetattr(fd) 9 try: 10 tty.setraw(fd) 11 return sys.stdin.read(1) 12 finally: 13# fd の属性を戻す 14 termios.tcsetattr(fd, termios.TCSADRAIN, old) 15 16 17# Unicodeを調べる 18while True: 19 print('key = ', end='') #<- ここが表示できない 20 key = getch() 21 print(key ,end='') 22 if key == chr(27) or key == '': 23 print('done') 24 break 25 print('\t: ',ord(key)) 26 27

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

print('key = ', end='')

改行を出力するまで、画面に反映されていないのでしょう。

print('key = ', end='',flush=True)
と、出力を強制します。

投稿2020/05/10 14:12

otn

総合スコア84557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

macg3n

2020/05/11 16:38

ご指摘の通りやりましたらその通りにできました! ありがとうございます。助かります。
macg3n

2020/05/11 16:49

ここで質問させていただきます。 改行を出力するまで画面に反映されていない ということについてもう少し詳しく教えていただけませんでしょうか? 例えば、別の.pyファイルで print( ' key = ' , end= ' ' ) と書いて実行すれば改行を出力せずに表示されます。 なぜgetch()を呼び出した時は画面に映すために改行の出力が必要になるのでしょうか? お手数をおかけして申し訳ないですが、どうぞよろしくお願いいたします。
otn

2020/05/11 23:31

> 例えば、別の.pyファイルで 現象の発生する最小限のプログラム全体を示してください。
macg3n

2020/05/13 02:05

print( ' key = ' , end= ' ' ) この一行のみです。これのみだと改行を出力せずに表示されます。 しかし、この後に getch() があると、otn様に教えていただいたように出力を強制しなければ表示されなくなります。入力待ちのカーソルのみで、それより前に書いた上の1行が表示されない状態です。 この違いはどこから発生するのかがわからないです。 よろしくお願いいたします。
otn

2020/05/13 02:49

その1行だけだと、プログラムがすぐに終了するので、当然プログラム終了時に表示されます。
guest

0

文字が消えてしまうんではなくて、最初から文字が表示されてないのでは。
文字を入力してるだけなので、文字を出力してやりましょう

投稿2020/05/10 13:34

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問