gpt4 book ai didi

python - 制作一个 "Any Key"可中断的 Python 定时器

转载 作者:行者123 更新时间:2023-11-28 22:52:25 25 4
gpt4 key购买 nike

我正在尝试制作一个简单的计时器,它会一直计数直到被键盘输入中断。

现在我正在使用 CTRL+C 来停止计时器,但我想做一些更简单的事情,比如按空格键或回车键或“任意键”。我听说这可以通过线程模块来完成,但经过几次尝试后,我显然不知道我在用它做什么。

这是我当前的代码:

def countup():
try:
a=0
for i in range(1000000) :
print i,'\r',
time.sleep(1)
except KeyboardInterrupt:
Z = raw_input("restart timer?" )
if Z == "Y" or Z == "y" :
countup()

最佳答案

使用 threadterminal capabilities你可以写(按任意键停止):

import thread
import time

def read_key():
import termios
import sys
fd = sys.stdin.fileno()
old = termios.tcgetattr(fd)
new = termios.tcgetattr(fd)
new[3] &= ~(termios.ICANON | termios.ECHO) # c_lflags
c = None
try:
termios.tcsetattr(fd, termios.TCSANOW, new)
c = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSANOW, old)
return c

def input_thread():
read_key()
thread.interrupt_main()

def countup():
try:
thread.start_new_thread(input_thread, ())
for i in range(1000000):
print i
time.sleep(1)
except KeyboardInterrupt:
Z = raw_input("restart timer? ")
if Z == 'y' or Z == 'Y':
countup()

让我们澄清一下:

thread.start_new_thread()使用 input_thread() 作为启动函数创建一个新线程。同时thread.interrupt_main()在主线程中引发 KeyboardInterrupt

termios.tcgetattr()返回当前的终端属性。 ~termios.ICANON 取消设置 canonical mode 和 ~termios.ECHO 阻止输入打印然后 termios.tsetattr()做出改变。

或者,在 Windows 上,getch() 来自 msvcrt可以代替 read_key()

使用
def input_thread():
msvcrt.getch()
thread.interrupt_main()

引用

关于python - 制作一个 "Any Key"可中断的 Python 定时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20439062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com