详解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基于matplotlib实现绘制三维图形功能示例
Jan 18 Python
python学习入门细节知识点
Mar 29 Python
Python-while 计算100以内奇数和的方法
Jun 11 Python
用python建立两个Y轴的XY曲线图方法
Jul 08 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
Jul 22 Python
Pytorch反向求导更新网络参数的方法
Aug 17 Python
python实现名片管理器的示例代码
Dec 17 Python
Python 内置变量和函数的查看及说明介绍
Dec 25 Python
pytorch对梯度进行可视化进行梯度检查教程
Feb 04 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
Python实现手势识别
Oct 21 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
Nov 28 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.ini中文版(2)
2006/10/09 PHP
php下连接ftp实现文件的上传、下载、删除文件实例代码
2010/06/03 PHP
PHP中使用curl伪造IP的简单方法
2015/08/07 PHP
Symfony2学习笔记之控制器用法详解
2016/03/17 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
IE与firefox下Dhtml的一些区别小结
2009/12/02 Javascript
JQuery一种取同级值的方式(比如你在GridView中)
2012/03/15 Javascript
深入理解JavaScript中的对象
2015/06/04 Javascript
Jquery常用的方法汇总
2015/09/01 Javascript
跨域请求两种方法 jsonp和cors的实现
2018/11/11 Javascript
javascript 设计模式之组合模式原理与应用详解
2020/04/08 Javascript
react项目从新建到部署的实现示例
2021/02/19 Javascript
Python3访问并下载网页内容的方法
2015/07/28 Python
Scrapy框架CrawlSpiders的介绍以及使用详解
2017/11/29 Python
Python装饰器(decorator)定义与用法详解
2018/02/09 Python
python使用openpyxl库修改excel表格数据方法
2018/05/03 Python
python验证码识别教程之利用投影法、连通域法分割图片
2018/06/04 Python
python opencv 图像拼接的实现方法
2019/06/27 Python
numpy创建单位矩阵和对角矩阵的实例
2019/11/29 Python
python如何基于redis实现ip代理池
2020/01/17 Python
python+selenium+PhantomJS抓取网页动态加载内容
2020/02/25 Python
Html5游戏开发之乒乓Ping Pong游戏示例(三)
2013/01/21 HTML / CSS
土耳其新趋势女装购物网站:Addax
2020/01/07 全球购物
说出ArrayList,Vector, LinkedList的存储性能和特性
2015/01/04 面试题
What's the difference between Debug and Trace class? (Debug类与Trace类有什么区别)
2013/09/10 面试题
维德科技C#面试题笔试题
2015/12/09 面试题
Linux中如何用命令创建目录
2016/12/02 面试题
《雕塑之美》教学反思
2014/04/24 职场文书
最常使用的求职信
2014/05/25 职场文书
汉语言文学毕业求职信
2014/07/17 职场文书
物业工程部经理岗位职责
2015/04/09 职场文书
2015年街道办事处工作总结
2015/05/22 职场文书
法院答辩状格式
2015/05/22 职场文书
讲座开场白台词和结束语
2015/05/29 职场文书
SpringBoot系列之MongoDB Aggregations用法详解
2022/02/12 MongoDB
使用CSS实现百叶窗效果示例代码
2023/05/07 HTML / CSS