我想用python处理控制台中的键盘事件。正在运行的脚本有一些持久的输出流,当管理员触发按键事件时,脚本会改变其输出内容。
我用如下代码完成了它(按'q'将触发输出更改),但有两个问题
- 我的输出空间增加了。调试后,我发现代码“tty.setraw(fd)”导致了这个问题,但我不知道如何解决它
- ctrl+c 不能再工作了(如果 # "tty.setraw(fd)", ctrl+c 会工作)
如果它太复杂,任何其他模块都可以做我想要的吗?我尝试了 curse 模块,似乎会冻结窗口输出并且无法在多线程中协调
#!/usr/bin/python
import sys
import select
import tty, termios
import threading
import time
def loop():
while loop_bool:
if switch:
output = 'aaaa'
else:
output = 'bbbb'
print output
time.sleep(0.2)
def change():
global switch
global loop_bool
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
while loop_bool:
tty.setraw(fd)
i,o,e = select.select([sys.stdin],[],[],1)
if len(i)!=0:
if i[0] == sys.stdin:
input = sys.stdin.read(1)
if input =='q':
if switch:
switch = False
else:
switch = True
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
except KeyboardInterrupt:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
loop_bool = False
try:
switch = True
loop_bool = True
t1=threading.Thread(target=loop)
t2=threading.Thread(target=change)
t1.start()
t2.start()
t1.join(1)
t2.join(1)
except KeyboardInterrupt:
loop_bool = False