详解Python实现按任意键继续/退出的功能


Posted in Python onAugust 19, 2016

前言

要实现该功能,需要的就是暂停程序、等待并捕捉用户的一个键盘输入,然后继续执行。Python 有内建的库能帮我们实现该功能,不过要区别对待 Windows 和 Linux。

msvcrt 中的 getch() 方法 能够帮助在 Windows 下实现,其作用是获取一个按键响应并返回对应的字符。它并不在命令行中回显。有如下程序段:

import msvcrt
print ord(msvcrt.getch())

这里利用 ord 将获得的字符转换为 ASCII 数值,例如捕获按键“d”(注意是小写)将得到数值100。

Linux 下呢?嗯,相对复杂一点点,不过先理清思路的话就好办了。

首先要知晓一下 Linux 终端的三种模式,分别为规范模式非规范模式 raw 模式

规范模式

规范模式,也被成为 cooked 模式,是用户常见的模式。驱动程序输入的字符保存在缓冲区,并且仅在接收到回车键时才将这些缓冲的字符发送到程序。缓冲数据使驱动程序可以实现最基本的编辑功能, 被指派这些功能的特定键在驱动程序里设置,可以通过命令 stty 或系统调用 tcsetattr 来修改。

非规范模式

当缓冲和编辑功能被关闭时,连接被成为非规范模式。终端处理器仍旧进行特定的字符处理,例如处理 Ctrl-C 及换行符之间的转换,但是编辑键将没有意义,因此相应的输入被视为常规的数据输入,程序需要自己实现编辑功能。

raw 模式

当所有处理都被关闭后,驱动程序将输入直接传递给程序,连接被成为 raw 模式。

这里我们需要借助于非规范模式,那么要实现刚才 Windows 上的相似行为,需要以下代码:

import os
import termios
 
# 获取标准输入的描述符
fd = sys.stdin.fileno()
 
# 获取标准输入(终端)的设置
old_ttyinfo = termios.tcgetattr(fd)
 
# 配置终端
new_ttyinfo = old_ttyinfo[:]
 
# 使用非规范模式(索引3是c_lflag 也就是本地模式)
new_ttyinfo[3] &= ~termios.ICANON
 
# 关闭回显(输入不会被显示)
new_ttyinfo[3] &= ~termios.ECHO
 
# 使设置生效
termios.tcsetattr(fd, termios.TCSANOW, new_ttyinfo)
 
# 从终端读取
print ord(os.read(fd, 7))

由此看来,我们只需利用上面的方法捕获一个按键响应,然后继续程序即可做到按任意键继续或退出的功能了。当然,做到按指定键继续或退出的功能也可以按类似的方法实现,例如:

import msvcrt
 
print("Press 'D' to exit...")
 
while True:
 if ord(msvcrt.getch()) in [68, 100]:
  break

这样,当用户按下“D”或“d”时,则程序退出。

总结

以上就是Python实现按任意键继续或退出的全部内容,希望本文的内容对大家学习Python能有所帮助。

Python 相关文章推荐
在Python中使用pngquant压缩png图片的教程
Apr 09 Python
Python实现高效求解素数代码实例
Jun 30 Python
详谈Python高阶函数与函数装饰器(推荐)
Sep 30 Python
Python数据拟合与广义线性回归算法学习
Dec 22 Python
对python中的argv和argc使用详解
Dec 15 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
Jan 06 Python
Python selenium模拟手动操作实现无人值守刷积分功能
May 13 Python
简单了解python列表和元组的区别
May 14 Python
Python selenium使用autoIT上传附件过程详解
May 26 Python
python批量处理多DNS多域名的nslookup解析实现
Jun 28 Python
Matplotlib.pyplot 三维绘图的实现示例
Jul 28 Python
python用Tkinter做自己的中文代码编辑器
Sep 07 Python
利用Python开发微信支付的注意事项
Aug 19 #Python
Python用模块pytz来转换时区
Aug 19 #Python
教你用python3根据关键词爬取百度百科的内容
Aug 18 #Python
利用Python爬取可用的代理IP
Aug 18 #Python
总结用Pdb库调试Python的方式及常用的命令
Aug 18 #Python
Python实现命令行通讯录实例教程
Aug 18 #Python
Python采用Django开发自己的博客系统
Sep 29 #Python
You might like
PHP中查询SQL Server或Sybase时TEXT字段被截断的解决方法
2009/03/10 PHP
PHP+MySQL投票系统的设计和实现分享
2012/09/23 PHP
PHP中的按位与和按位或操作示例
2014/01/27 PHP
php绘图之加载外部图片的方法
2015/01/24 PHP
帝国CMS留言板回复后发送EMAIL通知客户
2015/07/06 PHP
Yii中的relations数据关联查询及统计功能用法详解
2016/07/14 PHP
php如何修改SESSION的生存存储时间的实例代码
2017/07/05 PHP
如何让PHP编码更加好看利于阅读
2019/05/12 PHP
Nigma vs Alliance BO5 第二场2.14
2021/03/10 DOTA
DHTML Slide Show script图片轮换
2008/03/03 Javascript
JS替换文本域内的回车示例
2014/02/18 Javascript
JS实现简洁、全兼容的拖动层实例
2015/05/13 Javascript
JS简单限制textarea内输入字符数量的方法
2015/10/14 Javascript
jquery获取select选中值的方法分析
2015/12/22 Javascript
需灵活掌握的Bootstrap预定义排版类 你精通吗?
2016/06/20 Javascript
JavaScript实现一个空中避难的小游戏
2017/06/06 Javascript
JS实现的数组去除重复数据算法小结
2017/11/17 Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
2018/10/12 Javascript
JS实现数组去重及数组内对象去重功能示例
2019/02/02 Javascript
如何封装Vue Element的table表格组件
2021/02/06 Vue.js
用python实现的线程池实例代码
2018/01/06 Python
Python学习笔记之自定义函数用法详解
2019/06/08 Python
萌新HTML5 入门指南(二)
2020/11/09 HTML / CSS
应用化学专业本科生求职信
2013/09/29 职场文书
农村产权制度改革实施方案
2014/03/21 职场文书
《春到梅花山》教学反思
2014/04/16 职场文书
安全技术说明书
2014/05/09 职场文书
怎么写工作检讨书
2014/11/16 职场文书
环境建议书
2015/02/04 职场文书
慰问信模板
2015/02/14 职场文书
2015年文员个人工作总结
2015/04/09 职场文书
汉字听写大会观后感
2015/06/12 职场文书
运动会运动员赞词
2015/07/22 职场文书
2016大学生求职自荐信范文
2016/01/28 职场文书
装修安全责任协议书
2016/03/22 职场文书
详解Python中__new__方法的作用
2022/03/31 Python