2017-01-22 2 views
0

Я пытаюсь объединить модули Python для getch и progressbar на Linux, но я не могу заставить его работать. Я хочу использовать 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() 

При использовании моей собственной реализации Геча, я сузил проблему, чтобы быть с «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

Я бы предположил 'files.read()' блоков по умолчанию. Как насчет [urwid] (http://urwid.org/), который имеет цикл событий, события клавиатуры, виджет индикатора выполнения (среди прочего)? – blubberdiblub

ответ

0

У меня была такая же проблема в Linux, поэтому я выбрал другое решение: захватить сигнал SIGINT (CTRL + C), чтобы выйти изящно или сразу после двух нажатий (обычный способ 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) 
Смежные вопросы