详解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翻译软件实现代码(使用google api完成)
Nov 26 Python
pymongo实现多结果进行多列排序的方法
May 16 Python
通过源码分析Python中的切片赋值
May 08 Python
Python模拟用户登录验证
Sep 11 Python
Scrapy框架基本命令与settings.py设置
Feb 06 Python
python GUI库图形界面开发之PyQt5拖放控件实例详解
Feb 25 Python
python使用梯度下降算法实现一个多线性回归
Mar 24 Python
Python多进程编程常用方法解析
Mar 26 Python
Pandas读取csv时如何设置列名
Jun 02 Python
python入门:argparse浅析 nargs='+'作用
Jul 12 Python
如何Tkinter模块编写Python图形界面
Oct 14 Python
Python OpenCV超详细讲解读取图像视频和网络摄像头
Apr 02 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设计模式之解释器模式的深入解析
2013/06/13 PHP
解析阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql
2013/06/26 PHP
thinkPHP实现瀑布流的方法
2014/11/29 PHP
PHP实现多级分类生成树的方法示例
2017/02/07 PHP
ThinkPHP中create()方法自动验证表单信息
2017/04/28 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
2018/06/13 PHP
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
2014/06/02 Javascript
JS获取iframe中marginHeight和marginWidth属性的方法
2015/04/01 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
JavaScript使用Range调色及透明度实例
2016/09/25 Javascript
使用get方式提交表单在地址栏里面不显示提交信息
2017/02/21 Javascript
轻松学习Javascript闭包
2017/03/01 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
微信小程序实现录音功能
2019/11/22 Javascript
使用Webpack 搭建 Vue3 开发环境过程详解
2020/07/28 Javascript
python实现2014火车票查询代码分享
2014/01/10 Python
python实现进程间通信简单实例
2014/07/23 Python
Python标准库之多进程(multiprocessing包)介绍
2014/11/25 Python
介绍Python的Django框架中的静态资源管理器django-pipeline
2015/04/25 Python
使用pdb模块调试Python程序实例
2015/06/02 Python
python实现按行切分文本文件的方法
2016/04/18 Python
教你用一行Python代码实现并行任务(附代码)
2018/02/02 Python
python如何通过实例方法名字调用方法
2018/03/21 Python
python数字图像处理实现直方图与均衡化
2018/05/04 Python
Python实现基于POS算法的区块链
2018/08/07 Python
python使用sessions模拟登录淘宝的方式
2019/08/16 Python
python颜色随机生成器的实例代码
2020/01/10 Python
美国休闲服装品牌:Express
2016/09/24 全球购物
大学生怎样进行自我评价
2013/12/07 职场文书
公司经理任命书
2014/06/05 职场文书
解除劳动合同协议书(样本)
2014/10/02 职场文书
贷款收入证明范本
2015/06/12 职场文书
法制教育讲座心得体会
2016/01/14 职场文书
如何使用php生成zip压缩包
2021/04/21 PHP
MySQL的全局锁和表级锁的具体使用
2021/08/23 MySQL
R9700摩机记
2022/04/05 无线电