所以我试图利用msvcrt.getch()
在程序的任何地方选择退出(不使用KeyBoardInterrupt)。
我的代码目前看起来像这样:
导入msvcrt import sys
打印(“随时按q退出”)
while True:
pressedKey = msvcrt.getch()
if pressedKey == 'q':
sys.exit()
else:
# do some setup
if myvar == "string":
try:
# do stuff
except:
# do stuff
else:
#do stuff
如何在运行其他(# do stuff
块)的同时运行while循环来检测 q 的按键?
这样,如果用户继续使用该程序,他们只会运行一次。但如果他们点击 q ,那么该程序将退出。
答案 0 :(得分:1)
您可以在单独的帖子中读取密钥或(更好)use msvcrt.kbhit()
as @martineau suggested:
#!/usr/bin/env python
import msvcrt
from Queue import Empty, Queue
from threading import Thread
def read_keys(queue):
for key in iter(msvcrt.getch, 'q'): # until `q`
queue.put(key)
queue.put(None) # signal the end
q = Queue()
t = Thread(target=read_keys, args=[q])
t.daemon = True # die if the program exits
t.start()
while True:
try:
key = q.get_nowait() # doesn't block
except Empty:
key = Empty
else:
if key is None: # end
break
# do stuff
如果我想在第二个线程检测到某个按键时在主代码中执行某些操作,我将如何操作?
您不会对主线程中的按键做出反应,直到代码再次到达q.get_nowait()
,即您不会注意到按键直到"做东西"完成循环的当前迭代。如果你需要做一些可能需要很长时间的事情,那么你可能需要在另一个线程中运行它(如果在某些时候阻塞是可接受的,则启动新线程或使用线程池)。