2017-01-22 9 views
0

Linux上でgetchとprogressbar Pythonモジュールを組み合わせようとしていますが、動作させることができません。 getchを使ってプログレスバーを中断するためのキーボード入力を聞きたいですが、getchステートメントを挿入するとプログレスバーは自動的に更新を拒否し、キーボードのボタンを押すと更新するだけです。Getchとprogressbar

私が現在使用しているコードは以下の通りです。 ProgressBar2とgetchモジュールを使用していますが、私はtqdmと私自身のgetchメソッドを無駄に使ってみました。

bar = progressbar.ProgressBar() 
for i in range(101): 
    sleep(0.01) 
    bar.update(i) 
    ch = getch.getch() 

getchは私の独自の実装を使用する場合、私は次のコードで「sys.stdin.read(1)」行と一緒に問題を絞り込むました。

fd = sys.stdin.fileno() 
old_settings = termios.tcgetattr(fd) 
try: 
    tty.setraw(sys.stdin.fileno(), termios.TCSADRAIN) 
    ch = sys.stdin.read(1) 
finally: 
    termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) 
    return ch 

Windowsでは、msvcrtモジュールを使用しても問題はありません。

+0

私は 'file.read()'ブロックをデフォルトで使用します。イベントループ、キーボードイベント、プログレスバーウィジェット(他のものの中で)を持つ[urwid](http://urwid.org/)はどうでしょうか? – blubberdiblub

答えて

0

私はLinux上で同じ問題を抱えていたので、SIGINTシグナル(CTRL + C)をキャプチャして正常に終了するか、または2回のプレス(通常のSIGINT方法)の直後に解決策を選択しました。

import signal 
import time 

signal.signal(signal.SIGINT, signal_handler) 
sigint_again = False 
asked_termination = False 

def signal_handler(self, signal, frame): 
    """Handles SIGINT signal, blocks it to terminate gracefully""" 
    print('You pressed Ctrl+C!:', signal, frame) 
    if is_sigint_called_twice(): 
     print("\nForced terminating script!") 
     sys.exit(0) 
    asked_termination = True 

def is_sigint_called_twice(self): 
    """Check if pressing ctrl+c a second time to terminate immediately""" 
    if not sigint_again: 
     sigint_again = True 
     return False 
    else: 
     return True 

while not asked_termination: 
    print("do_stuff()") 
    time.sleep(1)