详解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根据距离和时长计算配速示例
Feb 16 Python
Python标准库06之子进程 (subprocess包) 详解
Dec 07 Python
Python栈算法的实现与简单应用示例
Nov 01 Python
Python简单计算给定某一年的某一天是星期几示例
Jun 27 Python
wxPython的安装与使用教程
Aug 31 Python
详解Python发送email的三种方式
Oct 18 Python
Pandas读写CSV文件的方法示例
Mar 27 Python
python轮询机制控制led实例
May 03 Python
python使用多线程+socket实现端口扫描
May 28 Python
浅谈anaconda python 版本对应关系
Oct 07 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
Oct 31 Python
Django执行源生mysql语句实现过程解析
Nov 12 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
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
2010/06/11 PHP
Gambit vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
参考:关于Javascript中实现暂停的几篇文章
2007/03/04 Javascript
jquery实现用户打分评分特效
2015/05/28 Javascript
JavaScript forEach()遍历函数使用及介绍
2015/07/08 Javascript
js判断主流浏览器类型和版本号的简单实现代码
2016/05/26 Javascript
微信小程序 video组件详解
2016/10/25 Javascript
Javascript设计模式之装饰者模式详解篇
2017/01/17 Javascript
js实现产品缩略图效果
2017/03/10 Javascript
原生JS改变透明度实现轮播效果
2017/03/24 Javascript
VueJS组件之间通过props交互及验证的方式
2017/09/04 Javascript
vue实现长图垂直居上 vue实现短图垂直居中
2017/10/18 Javascript
解决vue 更改计算属性后select选中值不更改的问题
2018/03/02 Javascript
用ES6写全屏滚动插件的示例代码
2018/05/02 Javascript
脚手架vue-cli工程webpack的基本用法详解
2018/09/29 Javascript
ES6 对象的新功能与解构赋值介绍
2019/02/05 Javascript
记一次vue-webpack项目优化实践详解
2019/02/17 Javascript
nodejs文件夹深层复制功能
2019/09/03 NodeJs
解决layui调用自定义方法提示未定义的问题
2019/09/14 Javascript
[01:02:04]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
python网络编程学习笔记(九):数据库客户端 DB-API
2014/06/09 Python
Python中线程的MQ消息队列实现以及消息队列的优点解析
2016/06/29 Python
SQLite3中文编码 Python的实现
2017/01/11 Python
Windows安装Python、pip、easy_install的方法
2017/03/05 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
2019/08/12 Python
解决Python pip 自动更新升级失败的问题
2020/02/21 Python
python函数中将变量名转换成字符串实例
2020/05/11 Python
python 安装移动复制第三方库操作
2020/07/13 Python
基于css3的属性transition制作菜单导航效果
2015/09/01 HTML / CSS
canvas拼图功能实现代码示例
2018/11/21 HTML / CSS
美国体育用品商店:Paragon Sports
2017/10/08 全球购物
Java工程师面试集锦之Spring框架
2013/06/16 面试题
安全检查验收制度
2014/01/12 职场文书
小学家长评语大全
2014/04/16 职场文书
村居抓节水倡议书
2014/05/19 职场文书
人事任命书怎么写
2014/06/05 职场文书