【发布时间】: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