详解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处理图片之PIL模块简单使用方法
May 11 Python
python获得文件创建时间和修改时间的方法
Jun 30 Python
剖析Python的Tornado框架中session支持的实现代码
Aug 21 Python
深入探究Django中的Session与Cookie
Jul 30 Python
pandas中Timestamp类用法详解
Dec 11 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
Jan 10 Python
Python安装模块的常见问题及解决方法
Feb 05 Python
python 读取文件并把矩阵转成numpy的两种方法
Feb 12 Python
python面向对象法实现图书管理系统
Apr 19 Python
python进阶之自定义可迭代的类
Aug 20 Python
浅谈matplotlib 绘制梯度下降求解过程
Jul 12 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
Nov 13 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
全国FM电台频率大全 - 16 河南省
2020/03/11 无线电
php切割页面div内容的实现代码分享
2012/07/31 PHP
详谈PHP文件目录基础操作
2014/11/11 PHP
PHP入门教程之字符串处理技巧总结(转换,过滤,解析,查找,截取,替换等)
2016/09/11 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
2017/08/01 PHP
PHP实现QQ登录的开原理和实现过程
2018/02/04 PHP
document.documentElement的一些使用技巧
2013/04/18 Javascript
javascript数组随机排序实例分析
2015/07/22 Javascript
完美实现bootstrap分页查询
2015/12/09 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
2016/01/28 Javascript
JavaScript暂停和继续定时器的实现方法
2016/07/18 Javascript
Angularjs 自定义服务的三种方式(推荐)
2016/08/02 Javascript
domReady的实现案例
2016/11/23 Javascript
vue动态注册组件实例代码详解
2019/05/30 Javascript
微信小程序转发事件实现解析
2019/10/22 Javascript
vue-router之实现导航切换过渡动画效果
2019/10/31 Javascript
解决Layui数据表格显示无数据提示的问题
2019/11/14 Javascript
vue-quill-editor 自定义工具栏和自定义图片上传路径操作
2020/08/03 Javascript
vue中实现点击空白区域关闭弹窗的两种方法
2020/12/30 Vue.js
100行python代码实现跳一跳辅助程序
2018/01/15 Python
详细解读tornado协程(coroutine)原理
2018/01/15 Python
详解分布式任务队列Celery使用说明
2018/11/29 Python
python 划分数据集为训练集和测试集的方法
2018/12/11 Python
Python获取数据库数据并保存在excel表格中的方法
2019/06/12 Python
python对矩阵进行转置的2种处理方法
2019/07/17 Python
Django logging配置及使用详解
2019/07/23 Python
NFL加拿大官方网上商店:NHLShop.ca
2019/03/12 全球购物
俄罗斯鲜花递送:AMF
2020/04/24 全球购物
开业庆典答谢词
2014/01/18 职场文书
解除劳动关系协议书范文
2014/09/11 职场文书
开展批评与自我批评发言稿
2014/10/16 职场文书
车辆挂靠协议书
2016/03/23 职场文书
创业计划书之蛋糕店
2019/08/29 职场文书
详解用Python把PDF转为Word方法总结
2021/04/27 Python
详解使用 CSS prefers-* 规范提升网站的可访问性与健壮性
2021/05/25 HTML / CSS
《仙剑客栈2》第一弹正式宣传片公开 年内发售
2022/04/07 其他游戏