详解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多进程multiprocessing用法实例分析
Aug 18 Python
Python3 SSH远程连接服务器的方法示例
Dec 29 Python
python 使用pdfminer3k 读取PDF文档的例子
Aug 27 Python
python集合的创建、添加及删除操作示例
Oct 08 Python
Python3.8对可迭代解包的改进及用法详解
Oct 15 Python
Python多继承以及MRO顺序的使用
Nov 11 Python
django连接mysql数据库及建表操作实例详解
Dec 10 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
Feb 16 Python
django 多数据库及分库实现方式
Apr 01 Python
Django Admin设置应用程序及模型顺序方法详解
Apr 01 Python
浅析Python 序列化与反序列化
Aug 05 Python
Python自动化测试PO模型封装过程详解
Jun 22 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
解决dede生成静态页和动态页转换的一些问题,及火车采集入库生成动态的办法
2007/03/29 PHP
解析PHP缓存函数的使用说明
2013/05/10 PHP
php模板原理讲解
2013/11/13 PHP
php时间戳转换的示例
2014/03/31 PHP
thinkphp自定义权限管理之名称判断方法
2017/04/01 PHP
(function(){})()的用法与优点
2007/03/11 Javascript
js 可拖动列表实现代码
2011/12/13 Javascript
javascript获取select的当前值示例代码(兼容IE/Firefox/Opera/Chrome)
2013/12/17 Javascript
jQuery使用CSS()方法给指定元素同时设置多个样式
2015/03/26 Javascript
JavaScript实现简单的tab选项卡切换
2016/01/05 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
2016/01/05 Javascript
分享js粘帖屏幕截图到web页面插件screenshot-paste
2020/08/21 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
jQuery ztree实现动态树形多选菜单
2016/08/12 Javascript
JavaScript定义数组的三种方法(new Array(),new Array('x','y')
2016/10/04 Javascript
AngularJS通过ng-route实现基本的路由功能实例详解
2016/12/13 Javascript
JavaScript实现仿Clock ISO时钟
2018/06/29 Javascript
JavaScript数组排序小程序实现解析
2020/01/13 Javascript
Javascript ParentNode和ChildNode接口原理解析
2020/03/16 Javascript
如何在 ant 的table中实现图片的渲染操作
2020/10/28 Javascript
深入理解python多进程编程
2016/06/12 Python
使用python装饰器计算函数运行时间的实例
2018/04/21 Python
利用pandas读取中文数据集的方法
2018/07/25 Python
python进程和线程用法知识点总结
2019/05/28 Python
详解python解压压缩包的五种方法
2019/07/05 Python
python3操作注册表的方法(Url protocol)
2020/02/05 Python
后备干部考察材料
2014/02/12 职场文书
大学开学计划书
2014/04/30 职场文书
教育系统干部作风整顿心得体会
2014/09/09 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
单位法人授权委托书范本
2014/10/09 职场文书
二年级语文下册复习计划
2015/01/19 职场文书
2015年高校辅导员工作总结
2015/04/20 职场文书
中国现代文学之经典散文三篇
2019/09/18 职场文书
导游词之潮音寺
2019/09/26 职场文书
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
2022/06/28 Oracle