Getch和进度条

时间:2017-01-22 09:23:32

标签: python progress-bar getch tqdm

我正在尝试在Linux上组合getch和progressbar Python模块,但我无法让它工作。我想使用getch来监听键盘输入以中断进度条,但是当我插入getch语句时,进度条会拒绝自动更新,只有当我按下键盘上的按钮时才会更新。

我目前使用的代码如下。我正在使用ProgressBar2和getch模块,但我尝试使用tqdm和我自己的getch方法无济于事。

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

当使用我自己的getch实现时,我已经将问题缩小到以下代码中的'sys.stdin.read(1)'行。

{{1}}

在Windows上,使用msvcrt模块,我没有任何问题。

1 个答案:

答案 0 :(得分: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)