详解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中的exec、eval使用实例
Sep 23 Python
Python实现简单拆分PDF文件的方法
Jul 30 Python
Python的条件语句与运算符优先级详解
Oct 13 Python
Python内存管理方式和垃圾回收算法解析
Nov 11 Python
Python温度转换实例分析
Jan 17 Python
基于python实现简单日历
Jul 28 Python
python 使用poster模块进行http方式的文件传输到服务器的方法
Jan 15 Python
python实现字符串加密成纯数字
Mar 19 Python
十行代码使用Python写一个USB病毒
Jun 21 Python
Pytorch技巧:DataLoader的collate_fn参数使用详解
Jan 08 Python
Python virtualenv虚拟环境实现过程解析
Apr 18 Python
Python入门基础之数字字符串与列表
Feb 01 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中extract()函数的定义和用法
2012/08/17 PHP
PHP实现手机归属地查询API接口实现代码
2012/08/27 PHP
php去除字符串换行符示例分享
2014/02/13 PHP
PHP下通过QRCode类库创建中间带网站LOGO的二维码
2014/07/12 PHP
php中socket通信机制实例详解
2015/01/03 PHP
谈谈PHP连接Access数据库的注意事项
2016/08/12 PHP
PHP验证码类ValidateCode解析
2017/01/07 PHP
php文件上传类的分享
2017/07/06 PHP
不提示直接关闭网页窗口的JS示例代码
2013/12/17 Javascript
jQuery控制的不同方向的滑动(向左、向右滑动等)
2014/07/18 Javascript
JS取得绝对路径的实现代码
2015/01/16 Javascript
js关于命名空间的函数实例
2015/02/05 Javascript
JavaScript操作select元素和option的实例代码
2016/01/29 Javascript
使用JS实现图片展示瀑布流效果的实例代码
2016/09/12 Javascript
微信小程序 实例开发总结
2017/04/26 Javascript
基于Vuex无法观察到值变化的解决方法
2018/03/01 Javascript
JavaScript闭包与作用域链实例分析
2019/01/21 Javascript
vue+elementUI实现表格关键字筛选高亮
2020/10/26 Javascript
python实现定时同步本机与北京时间的方法
2015/03/24 Python
Python的re模块正则表达式操作
2016/05/25 Python
Python编程中装饰器的使用示例解析
2016/06/20 Python
python导入时小括号大作用
2017/01/10 Python
Python全局锁中如何合理运用多线程(多进程)
2019/11/06 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
2019/12/27 Python
python音频处理的示例详解
2020/12/23 Python
利用纯CSS3实现文字向右循环闪过效果实例(可用于移动端)
2017/06/15 HTML / CSS
html5使用Canvas绘图的使用方法
2017/11/21 HTML / CSS
印度尼西亚最好的小工具在线商店:Erafone.com
2019/03/26 全球购物
JENNIFER BEHR官网:各种耳环和发饰
2020/06/07 全球购物
城市轨道专业个人求职信范文
2013/09/23 职场文书
蜜蜂引路教学反思
2014/02/04 职场文书
大学生个人实习的自我评价
2014/02/15 职场文书
新年寄语大全
2014/04/12 职场文书
2016年社区六一儿童节活动总结
2016/04/06 职场文书
pandas中pd.groupby()的用法详解
2022/06/16 Python
SpringBoot详解执行过程
2022/07/15 Java/Android