详解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 pdb调试方法分享
Jan 21 Python
Python使用scrapy采集时伪装成HTTP/1.1的方法
Apr 08 Python
python中input()与raw_input()的区别分析
Feb 27 Python
Python判断列表是否已排序的各种方法及其性能分析
Jun 20 Python
python 2.6.6升级到python 2.7.x版本的方法
Oct 09 Python
使用python实现ANN
Dec 20 Python
Python用 KNN 进行验证码识别的实现方法
Feb 06 Python
python实现RabbitMQ的消息队列的示例代码
Nov 08 Python
python使用Thread的setDaemon启动后台线程教程
Apr 25 Python
Pycharm安装并配置jupyter notebook的实现
May 18 Python
详解Python中的编码问题(encoding与decode、str与bytes)
Sep 30 Python
Python天气语音播报小助手
Sep 25 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
无线电广播的开始
2002/01/30 无线电
粗略计算在线时间,bug:ip相同
2006/12/09 PHP
解析php扩展php_curl.dll不加载的解决方法
2013/06/26 PHP
PHP使用SOAP调用.net的WebService数据
2013/11/12 PHP
PHP中的empty、isset、isnull的区别与使用实例
2019/03/22 PHP
javascript 写类方式之一
2009/07/05 Javascript
javascript 面向对象编程 万物皆对象
2009/09/17 Javascript
Javascript string 扩展库代码
2010/04/09 Javascript
一段批量给页面上的控件赋值js
2010/06/19 Javascript
js 获取和设置css3 属性值的实现方法
2013/05/06 Javascript
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
2013/05/15 Javascript
浅析nodejs实现Websocket的数据接收与发送
2015/11/19 NodeJs
JS截取字符串实例详解
2015/11/24 Javascript
实例讲解Jquery中隐藏hide、显示show、切换toggle的用法
2016/05/13 Javascript
js实现可控制左右方向的无缝滚动效果
2016/05/29 Javascript
JS图片等比例缩放方法完整示例
2016/08/03 Javascript
深入理解react-router@4.0 使用和源码解析
2017/05/23 Javascript
JavaScript之promise_动力节点Java学院整理
2017/07/03 Javascript
Vant 在vue-cli 4.x中按需加载操作
2020/11/05 Javascript
Python 除法小技巧
2008/09/06 Python
python实现稀疏矩阵示例代码
2017/06/09 Python
Tornado 多进程实现分析详解
2018/01/12 Python
Python OpenCV实现图片上输出中文
2018/01/22 Python
利用python计算时间差(返回天数)
2019/09/07 Python
PyInstaller的安装和使用的详细步骤
2020/06/02 Python
python3处理word文档实例分析
2020/12/01 Python
详解python的xlwings库读写excel操作总结
2021/02/26 Python
webapp字号大小跟随系统字号大小缩放的示例代码
2018/12/26 HTML / CSS
焊接专业毕业生求职信
2013/10/01 职场文书
建筑专业自荐信
2013/10/18 职场文书
高三毕业典礼演讲稿
2014/05/13 职场文书
临时用工协议书范本
2014/10/29 职场文书
中秋客户感谢信
2015/01/22 职场文书
2019年消防宣传标语集锦
2019/11/21 职场文书
CSS实现两列布局的N种方法
2021/08/02 HTML / CSS
搭建Yolov5服务器
2022/04/30 Servers