详解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实例之wxpython中Frame使用方法
Jun 09 Python
python实现的解析crontab配置文件代码
Jun 30 Python
Python运行报错UnicodeDecodeError的解决方法
Jun 07 Python
python读取和保存视频文件
Apr 16 Python
Python OpenCV处理图像之图像直方图和反向投影
Jul 10 Python
python 正确保留多位小数的实例
Jul 16 Python
Python3.7实现中控考勤机自动连接
Aug 28 Python
Python运维自动化之nginx配置文件对比操作示例
Aug 29 Python
keras实现调用自己训练的模型,并去掉全连接层
Jun 09 Python
python自动化测试三部曲之request+django实现接口测试
Oct 07 Python
使用OpenCV校准鱼眼镜头的方法
Nov 26 Python
python中24小时制转换为12小时制的方法
Jun 18 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中使用Curl、socket、file_get_contents三种方法POST提交数据
2011/08/12 PHP
使用JSON实现数据的跨域传输的php代码
2011/12/20 PHP
PHP连接Nginx服务器并解析Nginx日志的方法
2015/08/16 PHP
图文详解PHP环境搭建教程
2016/07/16 PHP
PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)
2016/09/11 PHP
php类自动装载、链式操作、魔术方法实现代码
2017/07/23 PHP
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
JavaScript:new 一个函数和直接调用函数的区别分析
2013/07/10 Javascript
Knockout text绑定DOM的使用方法
2013/11/15 Javascript
详解addEventListener的三个参数之useCapture
2015/03/16 Javascript
ES6新特性之Symbol类型用法分析
2017/03/31 Javascript
微信小程序中做用户登录与登录态维护的实现详解
2017/05/17 Javascript
初识 Vue.js 中的 *.Vue文件
2017/11/22 Javascript
详解ES6语法之可迭代协议和迭代器协议
2018/01/13 Javascript
vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】
2019/03/16 Javascript
[44:40]2018DOTA2亚洲邀请赛3月30日 小组赛A组Liquid VS OG
2018/03/31 DOTA
[01:12:44]VG vs Mineski Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
[03:01]完美盛典趣味短片 DOTA2年度最佳&拉胯英雄
2019/12/07 DOTA
用Python给文本创立向量空间模型的教程
2015/04/23 Python
urllib和BeautifulSoup爬取维基百科的词条简单实例
2018/01/17 Python
pandas全表查询定位某个值所在行列的方法
2018/04/12 Python
python 平衡二叉树实现代码示例
2018/07/07 Python
python实现简单的文字识别
2018/11/27 Python
python查看文件大小和文件夹内容的方法
2019/07/08 Python
Python代码块及缓存机制原理详解
2019/12/13 Python
Python IDLE或shell中切换路径的操作
2020/03/09 Python
html5如何及时更新缓存文件(js、css或图片)
2013/06/24 HTML / CSS
h5调用摄像头的实现方法
2016/06/01 HTML / CSS
超30万乐谱下载:Musicnotes.com
2016/09/24 全球购物
行政助理的职责
2013/11/14 职场文书
《维生素c的故事》教学反思
2014/02/18 职场文书
简单租房协议书范本
2014/08/20 职场文书
写给纪委的违纪检讨书
2015/05/05 职场文书
2016猴年开门红标语口号
2015/12/26 职场文书
Java基础之线程锁相关知识总结
2021/06/30 Java/Android
Mysql使用全文索引(FullText index)的实例代码
2022/04/03 MySQL