按“空格键”停止暂停循环,再按一次继续循环(参见更新)

时间:2017-05-25 13:24:02

标签: python multithreading loops

from PIL import Image
import time
import subprocess
for i in bio:
    p = subprocess.Popen(["C:\Program Files\IrfanView\i_view64.exe",'C:\\Users\Moondra\\Bioteck_charts\{}.png'.format(i)])
    time.sleep(5)
    p.kill()

这是我目前的代码。 我在Windows 7上。我正在遍历列表,对于每个元素,我打开一张图片,然后在5秒后关闭它。但是,如果我想更长时间地研究图像然后能够从我离开的地方恢复循环,我希望能够暂停这个循环。

Psudo-code是这样的:

from PIL import Image
import time
import subprocess
for i in bio:

    p = subprocess.Popen(["C:\Program Files\IrfanView\i_view64.exe",'C:\\Users\Moondra\\Bioteck_charts\{}.png'.format(i)])
    time.sleep(5)
    if Keypress == 'Spacebar': 
        pause
        if Keypress =="Spacebar": resume


    p.kill()

我看到这两个线程,但是一个超过9年(在用户输入上)并且使用线程(我不是很熟悉)看起来都很复杂。

用户输入:

How to get user input during a while loop without blocking

暂停循环:

Python - using [spacebar] to pause for loop

有没有一种干净的方式来做我想做的事情?

编辑:

使用msvcrt

进行测试
from msvcrt import getch
while True:
    key = ord(getch())
    print(key)
    if key == 27: #ESC
        break

似乎输出255(一遍又一遍)。 如果按esc,则没有反应和循环不会中断。 尽管按下不同的键,打印的数字(255)也不会改变。

更新

我正在以不同的方式尝试它。不确定这是否更好,但是,我发现了一个名为keyboard的模块,它知道按键输入(并且在使用它之后,似乎工作正常)。 我试图使用线程来做到这一点,但似乎我没有得到线程正确的时机。我认为问题是当我的线程中调用了time.sleep()时,我的按键不被读取。

来自线程导入线程 导入键盘 导入子流程 进口泡菜

def keyboard_press():
    while p == True:
        if keyboard.is_pressed('down') == True:
            print('yes')
            input()
            p.kill()
        #continue


with open('C:\\Users\Moondra\\Bioteck.pickle', 'rb') as file:
    bio = pickle.load(file)



for i in bio[:5]:

    p = subprocess.Popen(["C:\Program Files\IrfanView\i_view64.exe",'C:\\Users\Moondra\\Bioteck_charts\{}.png'.format(i)])
    from threading import Thread
    t = Thread(target = keyboard_press, args =())
    t.start()
    t.join()
    time.sleep(3)
    p.kill()

1 个答案:

答案 0 :(得分:1)

您正在寻找KeyPress而不是输入(),请查看this以供参考