详解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模拟新浪微博登陆功能(新浪微博爬虫)
Dec 24 Python
Python读写unicode文件的方法
Jul 10 Python
Python网络爬虫中的同步与异步示例详解
Feb 03 Python
python+selenium实现简历自动刷新的示例代码
May 20 Python
关于ResNeXt网络的pytorch实现
Jan 14 Python
appium+python adb常用命令分享
Mar 06 Python
浅谈Python线程的同步互斥与死锁
Mar 22 Python
Python OrderedDict字典排序方法详解
May 21 Python
为什么称python为胶水语言
Jun 16 Python
通过实例解析python创建进程常用方法
Jun 19 Python
python rsa-oaep加密的示例代码
Sep 23 Python
Pytorch使用shuffle打乱数据的操作
May 20 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发送邮件类代码附详细说明
2008/07/10 PHP
PHP提示Notice: Undefined variable的解决办法
2012/11/24 PHP
PHP XML和数组互相转换详解
2016/10/26 PHP
获取select元素被选中的文本内容的js代码
2014/01/29 Javascript
NodeJS学习笔记之(Url,QueryString,Path)模块
2015/01/13 NodeJs
jQuery中offsetParent()方法用法实例
2015/01/19 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
2015/10/09 Javascript
js数组如何添加json数据及js数组与json的区别
2015/10/27 Javascript
举例讲解JavaScript substring()的使用方法
2015/11/09 Javascript
jquery简单倒计时实现方法
2015/12/18 Javascript
js简单判断移动端系统的方法
2016/02/25 Javascript
Javascript类型系统之undefined和null浅析
2016/07/13 Javascript
基于JavaScript Array数组方法(新手必看篇)
2016/08/20 Javascript
基于jquery实现二级联动效果
2017/03/30 jQuery
jQuery加密密码到cookie的实现代码
2017/04/18 jQuery
JavaScript如何获取到导航条中HTTP信息
2017/10/10 Javascript
ajax与jsonp的区别及用法
2018/10/16 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
Node.js API详解之 string_decoder用法实例分析
2020/04/29 Javascript
linux 下实现python多版本安装实践
2014/11/18 Python
Python数据结构与算法之字典树实现方法示例
2017/12/13 Python
Django中url的反向查询的方法
2018/03/14 Python
在Python中过滤Windows文件名中的非法字符方法
2019/06/10 Python
浅析PEP570新语法: 只接受位置参数
2019/10/15 Python
python中提高pip install速度
2020/02/14 Python
Python实现封装打包自己写的代码,被python import
2020/07/12 Python
欧洲领先的火车票和大巴票预订平台:Trainline
2018/12/26 全球购物
购买正版游戏和游戏激活码:Green Man Gaming
2019/11/06 全球购物
汽车检测与维修应届毕业生求职信
2013/10/19 职场文书
电子商务个人自荐信
2013/12/12 职场文书
军训自我鉴定怎么写
2014/02/13 职场文书
领导班子三严三实对照检查材料
2014/09/25 职场文书
“向国旗敬礼”主题班会活动设计方案
2014/09/27 职场文书
2015年人力资源部工作总结
2015/04/30 职场文书
合同纠纷调解书
2015/05/20 职场文书
医院见习总结
2015/06/24 职场文书