【问题标题】:pressing "spacebar" to stop a pause a loop, press again to resume loop (see UPDATE)按“空格键”停止暂停循环,再次按以恢复循环(请参阅更新)
【发布时间】:2017-05-25 13:24:01
【问题描述】:
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 秒后关闭它。但是,如果我想更长时间地研究图像,我希望能够暂停这个循环,然后能够从我停止的地方恢复循环。

伪代码是这样的:

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()

【问题讨论】:

    标签: python multithreading loops


    【解决方案1】:

    您希望检测 KeyPress 而不是 Input(),请查看 this 以供参考

    【讨论】:

    • 谢谢。我会更新我的OP。我在粘贴的链接中查看了接受的答案;我使用的是 Windows 7,所以似乎无法使用 termios?
    • 不,你不能,但 msft stackoverflow.com/questions/12175964/… 也有类似的答案
    • 谢谢。 msvcrt 似乎没有检测到我的按键。我已经用我对 msvcrt 的尝试和我得到的响应更新了我的 OP。有什么我做错了吗?
    猜你喜欢
    • 2013-02-22
    • 2017-07-03
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 2015-01-23
    • 2022-01-06
    • 2012-06-29
    • 1970-01-01
    相关资源
    最近更新 更多