详解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变量作用范围实例分析
Jul 07 Python
Python匹配中文的正则表达式
May 11 Python
Python selenium 三种等待方式解读
Sep 15 Python
修复 Django migration 时遇到的问题解决
Jun 14 Python
python 快速把超大txt文件转存为csv的实例
Oct 26 Python
对python读取CT医学图像的实例详解
Jan 24 Python
Python变量类型知识点总结
Feb 18 Python
Python Datetime模块和Calendar模块用法实例分析
Apr 15 Python
Django自定义用户登录认证示例代码
Jun 30 Python
如何在Python对Excel进行读取
Jun 04 Python
Python Django获取URL中的数据详解
Nov 01 Python
python turtle绘图命令及案例
Nov 23 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
实用函数7
2007/11/08 PHP
php好代码风格的阶段性总结
2016/06/25 PHP
PHP使用mongoclient简单操作mongodb数据库示例
2019/02/08 PHP
解决tp5在nginx下修改配置访问的问题
2019/10/16 PHP
详解new function(){}和function(){}() 区别分析
2008/03/22 Javascript
javascript 动态调整图片尺寸实现代码
2009/12/28 Javascript
js 省地市级联选择
2010/02/07 Javascript
从零开始学习jQuery (二) 万能的选择器
2010/10/01 Javascript
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
2011/03/25 Javascript
JavaScript 更严格的相等 [译]
2012/09/20 Javascript
JavaScript instanceof 的使用方法示例介绍
2013/10/23 Javascript
window.returnValue使用方法示例介绍
2014/07/03 Javascript
JavaScript代码性能优化总结篇
2016/05/15 Javascript
Jquery对新插入的节点 绑定Click事件失效的解决方法
2016/06/02 Javascript
深入理解JavaScript内置函数
2016/06/03 Javascript
BootStrap table使用方法分析
2016/11/08 Javascript
javascript设计模式之策略模式学习笔记
2017/02/15 Javascript
ES6新特性七:数组的扩充详解
2017/04/21 Javascript
使用vue-cli+webpack搭建vue开发环境的方法
2017/12/22 Javascript
基于substring()和substr()的使用以及区别(实例讲解)
2017/12/28 Javascript
vue引入axios同源跨域问题
2018/09/27 Javascript
vue实现的树形结构加多选框示例
2019/02/02 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
vue动态循环出的多个select出现过的变为disabled(实例代码)
2019/11/10 Javascript
在Python函数中输入任意数量参数的实例
2019/07/16 Python
使用HTML5在网页中嵌入音频和视频播放的基本方法
2016/02/22 HTML / CSS
西尔斯百货官网:Sears
2016/09/06 全球购物
Staples加拿大官方网站:办公用品一站式采购
2016/09/25 全球购物
Madewell澳大利亚官方网站:美国休闲服饰品牌
2019/07/18 全球购物
校园广播稿500字
2014/02/04 职场文书
高中军训感言500字
2014/02/24 职场文书
介绍信格式
2015/01/30 职场文书
2015年学生会主席工作总结
2015/04/21 职场文书
2016年情人节广告语
2016/01/28 职场文书
五年级语文教学反思
2016/03/03 职场文书
python 远程执行命令的详细代码
2022/02/15 Python