2014-11-25 153 views
1

我正在寻找一种方法,当用户按[空格键]时,暂停下面的for循环,然后再次按[空格键]时从最近一次迭代继续循环。Python - 使用[空格键]暂停循环

目前,脚本会提示用户输入三个值,然后按定时间隔从文本文件中打印单词,直到没有剩余单词。

什么是最好的方式去做这件事?非常感谢。

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) 
+0

看看[curses编程](https://docs.python.org/3/howto/curses.html)。 – eryksun 2014-11-25 17:18:09

回答

0

这里是部分回答你的问题(关于空间的部分没有回答,但是请阅读到最后,有一些提示)。 我改编了这里的答案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) 

用户可以按下Enter按钮暂停/继续阅读。 对于空间你可以尝试使用这个答案的食谱How to get user input during a while loop without blocking

...或者使用一些控制台ui(curses,urwid,...)或gui(tkinter,pyqt,...)模块。