Python - using [spacebar] to pause for loop

老子叫甜甜 提交于 2019-12-23 04:09:44

问题


I am looking for a way to pause the for loop below when the user presses [spacebar] and then continue the loop from the most recent iteration when [spacebar] is pressed again.

Currently, the script prompts the user for three values and then prints words from a text file at timed intervals until there are no words remaining.

What would be the best way to go about this? Thanks very much.

import time

with open('Textfile.txt', 'r', encoding='utf8') as file:

    data = file.read()
    data2 = data.split()


def reading(start, speed, chunks):

    for i in range(start, len(data2), chunks):

        print('\r' + (' '.join(data2[i:i+chunks])), end="")

        time.sleep(60 / speed * chunks)

    print ("The End.")


start = int(input('Where would you like to start? (word number) '))
speed = int(input('How many words per minute? '))
chunks = int(input('How many words at a time? '))

reading(start, speed, chunks)

回答1:


Here is partial answer to you question (part about space is not answered, however please read to the end, there are some hints). I adapted answer from here Non-blocking read on a subprocess.PIPE in python .

import time
import sys
from threading import Thread
try:
    from Queue import Queue, Empty
except ImportError:
    from queue import Queue, Empty  # python 3.x


def enqueue_output(output, queue):
    for line in iter(output, b''):
        queue.put(line)
    out.close()


with open('Textfile.txt', 'r', encoding='utf8') as file:
    data = file.read()
    data2 = data.split()


def reading(start, speed, chunks):
    q = Queue()
    t = Thread(target=enqueue_output, args=(sys.stdin.readline, q))
    t.daemon = True # thread dies with the program
    t.start()

    for i in range(start, len(data2), chunks):
        print('\r' + (' '.join(data2[i:i+chunks])), end="")
        time.sleep(60 / speed * chunks)

        try:
            line = q.get_nowait() # or q.get(timeout=.1)
        except Empty:
            pass
        else:
            print("Pausing")
            while 1:
                time.sleep(0.3) # Adjust frequency of reading user's input
                try:
                    line = q.get_nowait() # or q.get(timeout=.1)
                except Empty:
                    pass
                else:
                    print("Resuming")
                    break

    print ("The End.")


start = int(input('Where would you like to start? (word number) '))
speed = int(input('How many words per minute? '))
chunks = int(input('How many words at a time? '))

reading(start, speed, chunks)

With this user will be able to pause/resume reading with pressing Enter button. For space you can try to use recipes from this answer How to get user input during a while loop without blocking

...or use some console ui (curses, urwid, ...) or gui (tkinter, pyqt, ...) modules.



来源:https://stackoverflow.com/questions/27126471/python-using-spacebar-to-pause-for-loop

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!