详解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实现批量转换文件编码(批转换编码示例)
Jan 23 Python
手动实现把python项目发布为exe可执行程序过程分享
Oct 23 Python
使用grappelli为django admin后台添加模板
Nov 18 Python
python实现雨滴下落到地面效果
Jun 21 Python
python中aioysql(异步操作MySQL)的方法
Apr 11 Python
django多对多表的创建,级联删除及手动创建第三张表
Jul 25 Python
python科学计算之scipy——optimize用法
Nov 25 Python
tensorflow多维张量计算实例
Feb 11 Python
Python标准库shutil模块使用方法解析
Mar 10 Python
学会python自动收发邮件 代替你问候女友
May 20 Python
Python tkinter制作单机五子棋游戏
Sep 14 Python
在Python中实现字典反转案例
Dec 05 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
使用 eAccelerator加速PHP代码的方法
2007/09/30 PHP
CI框架入门示例之数据库取数据完整实现方法
2014/11/05 PHP
php文件上传类完整实例
2016/05/14 PHP
thinkPHP框架实现图像裁剪、缩放、加水印的方法
2017/03/14 PHP
TP5框架实现的数据库备份功能示例
2020/04/05 PHP
DEFER怎么用?
2006/07/01 Javascript
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
Javascript解析URL方法详解
2014/12/05 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
2015/01/13 Javascript
angularJS提交表单(form)
2015/02/09 Javascript
基于zepto.js实现仿手机QQ空间的大图查看组件ImageView.js详解
2015/03/05 Javascript
一个用jquery写的判断div滚动条到底部的方法【推荐】
2016/04/29 Javascript
AngularJS基础 ng-keydown 指令简单示例
2016/08/02 Javascript
JavaScript如何获取一个元素的样式信息
2019/07/29 Javascript
vscode 调试 node.js的方法步骤
2020/09/15 Javascript
vue中实现弹出层动画效果的示例代码
2020/09/25 Javascript
python修改字典内key对应值的方法
2015/07/11 Python
浅谈Python Opencv中gamma变换的使用详解
2018/04/02 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
2019/04/04 Python
python元组和字典的内建函数实例详解
2019/10/22 Python
wxPython绘图模块wxPyPlot实现数据可视化
2019/11/19 Python
pytorch 模拟关系拟合——回归实例
2020/01/14 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
2020/03/04 Python
SpringBoot实现登录注册常见问题解决方案
2020/03/04 Python
keras 获取某层输出 获取复用层的多次输出实例
2020/05/23 Python
谈谈对css属性box-sizing的了解
2017/01/04 HTML / CSS
健身场所或家用健身设备:Life Fitness
2017/11/01 全球购物
荷兰鞋子在线:Nelson Schoenen
2017/12/25 全球购物
《一本男孩子必读的书》教学反思
2014/02/19 职场文书
2015年企业新年寄语
2014/12/08 职场文书
2015年人事科工作总结
2015/04/28 职场文书
学生乘坐校车安全责任书
2015/05/11 职场文书
少年雷锋观后感
2015/06/10 职场文书
五星红旗迎风飘扬观后感
2015/06/17 职场文书
每日六道java新手入门面试题,通往自由的道路
2021/06/30 Java/Android