簡體   English   中英

使用 Pynput 按鍵暫停和取消暫停 TQDM 進度條

[英]Pause and Unpause TQDM Progress Bar Using Pynput Key Press

我正在創建一個使用 TQDM 進度條庫的小程序,我想在其中按空格來“暫停”和“取消暫停”進度條。 進度條應該每秒更新一次,並在輸入的時間量完成時運行到 100%。 請參閱我在下面所做的嘗試,在運行時,進度條永遠不會自行更新。 感謝您的反饋。

from tqdm import tqdm
from pynput import keyboard

class TimerTimer:
    def __init__(self, fileLoc) -> None:
        self.timer_list = self.get_timer_list(fileLoc)
        self.timer_length = len(self.timer_list)
        self.kb_listener = None
        self.init_val = 0
        self.wait = False

    def on_press_or_release(self, key):
        if key == keyboard.Key.esc:
            print("Exiting")
            exit()
        if key == keyboard.Key.space:
            self.wait = not self.wait
            printStr = "\nPaused...\n" if self.wait else "\nResumed!"
            print(printStr)
            return False

    def timer_with_progress(self, time_limit, name):
        print("{} for {} seconds:".format(name, time_limit))
        t = tqdm(total=time_limit, desc=name, ncols=100, initial=self.init_val)

        #for i in tqdm(range(time_limit), desc=name, ncols=100, initial=self.init_val):
        for i in range(time_limit):
            # sleep(1)
            # The event listener will be running in this block
            with keyboard.Events() as events:
                # Block at most one second
                event = events.get(1.0)
                if event is None:
                    break
                elif event.key == keyboard.Key.esc:
                    print("Exiting")
                    exit()
                elif event.key == keyboard.Key.space:
                    self.wait = not self.wait
                    printStr = "\nPaused...\n" if self.wait else "\nResumed!"
                    print(printStr)
                else:
                    break

            t.update()
            # t.refresh()
        t.close()

    def run(self):
        for index in self.timer_list:
            timer_cmd_list = ["self.timer_with_progress(5, 'Rest')",
                            "self.timer_with_progress(self.timer_list[index]['durationSeconds'], self.timer_list[index]['timerName'])"]
            for cmd in timer_cmd_list:
                if not self.wait:
                    exec(cmd)
                else:
                    if self.kb_listener is None:
                        self.kb_listener = keyboard.Listener(on_press = self.on_press_or_release) # , on_release = self.on_press_or_release)
                        self.kb_listener.start()
                    self.kb_listener.join() # Waits until the key is pressed again
                    self.wait = not self.wait # Once the button is pressed again, it changes the flag


if __name__=="__main__":
    tt = TimerTimer(filename)
    tt.run()

因此,經過一些研究,我發現 progressbar2 似乎實現了更好的中斷來完成我的目標。 見下文:

import progressbar
from pynput import keyboard
from time import sleep

class TimerTimer:
    def __init__(self, fileLoc) -> None:
        self.timer_list = self.get_timer_list(fileLoc)
        self.timer_length = len(self.timer_list)
        self.wait = False

    def on_press(self, key):
        pass

    def on_release(self, key):
        if key == keyboard.Key.space:
            self.wait = not self.wait
            printStr = "Paused..." if self.wait else "\nResuming..."
            print(printStr)
        elif key == keyboard.Key.esc:
            print("Exiting")
            exit()

    def timer_with_progress(self, time_limit: int, name: str, iter:int=1) -> None:
        """Function that runs the progressbar2 progress bar.

        Keyword arguments:
        time_limit -- (int) The time limit (in seconds) for the progress bar.
        name -- (string) The Name of the progress bar, or the brief description.
        iter -- (int) The iteration time in seconds.  (default 1)
        """
        print("{} for {} seconds:".format(color.BOLD + name +color.END, time_limit))
        bar = progressbar.ProgressBar(max_value=time_limit)
        i = 0
        # Adding keyboard listener
        listener = keyboard.Listener(on_press=self.on_press, on_release=self.on_release)
        listener.start()
        while i <= time_limit:
            sleep(iter)
            if not self.wait:
                bar.update(i)
                i += iter
        bar.finish()

    def run(self):
        for index in self.timer_list:
            self.timer_with_progress(5, 'Rest')
            self.timer_with_progress(self.timer_list[index]['durationSeconds'], self.timer_list[index]['timerName'])


if __name__=="__main__":
    tt = TimerTimer(filename)
    tt.run()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM