详解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写xml文件的操作实例
Oct 05 Python
更改Python命令行交互提示符的方法
Jan 14 Python
Python新手在作用域方面经常容易碰到的问题
Apr 03 Python
python cx_Oracle模块的安装和使用详细介绍
Feb 13 Python
Python matplotlib画图实例之绘制拥有彩条的图表
Dec 28 Python
Python列表推导式与生成器用法分析
Aug 02 Python
基于sklearn实现Bagging算法(python)
Jul 11 Python
python模拟预测一下新型冠状病毒肺炎的数据
Feb 01 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
Feb 29 Python
Pytorch使用PIL和Numpy将单张图片转为Pytorch张量方式
May 25 Python
如何利用python 读取配置文件
Jan 06 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
Jan 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
德生9700DX电路分析
2021/03/02 无线电
PHP 函数执行效率的小比较
2010/10/17 PHP
php&mysql 日期操作小记
2012/02/27 PHP
php foreach正序倒序输出示例代码
2014/07/01 PHP
PHP获取某个月最大天数(最后一天)的方法
2015/07/29 PHP
浅谈PHP面向对象之访问者模式+组合模式
2017/05/22 PHP
基于php编程规范(详解)
2017/08/17 PHP
javascript 简单高效判断数据类型 系列函数 By shawl.qiu
2007/03/06 Javascript
firefox firebug中文入门教程 脚本之家新年特别版
2010/01/02 Javascript
js模拟滚动条(横向竖向)
2013/02/22 Javascript
通过一段代码简单说js中的this的使用
2013/07/23 Javascript
鼠标经过tr时,改变tr当前背景颜色
2014/01/13 Javascript
javascript中indexOf技术详解
2015/05/07 Javascript
JS中setTimeout的巧妙用法前端函数节流
2016/03/24 Javascript
jQuery得到多个值只能用取Class ,不能用取ID的方法
2016/12/04 Javascript
JavaScript中闭包的详解
2017/04/01 Javascript
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
打通前后端构建一个Vue+Express的开发环境
2018/07/17 Javascript
layui弹出层按钮提交iframe表单的方法
2018/08/20 Javascript
为什么说JavaScript预解释是一种毫无节操的机制详析
2018/11/18 Javascript
使用node.JS中的url模块解析URL信息
2020/02/06 Javascript
解决vue打包报错Unexpected token: punc的问题
2020/10/24 Javascript
在Python中使用全局日志时需要注意的问题
2015/05/06 Python
Python单链表简单实现代码
2016/04/27 Python
Python 调用Java实例详解
2017/06/02 Python
python读取图片任意范围区域
2019/01/23 Python
树莓派与PC端在局域网内运用python实现即时通讯
2019/06/22 Python
python数据挖掘需要学的内容
2019/06/23 Python
python pandas获取csv指定行 列的操作方法
2019/07/12 Python
python计算无向图节点度的实例代码
2019/11/22 Python
DataFrame.groupby()所见的各种用法详解
2020/06/14 Python
草莓网化妆品加拿大网站:Strawberrynet Canada
2016/09/20 全球购物
写一个在SQL Server创建表的SQL语句
2012/03/10 面试题
数学专业毕业生自荐信
2013/11/10 职场文书
致跳远运动员广播稿
2014/02/11 职场文书
错误码NET::ERR_CERT_DATE_INVALID证书已过期解决方法?
2022/07/07 数码科技