实现python版本的按任意键继续/退出


Posted in Python onSeptember 26, 2016

某天在群内有同学问到,在python下我用input或者raw_input都得输入完后回车才能获取到输入的值,那如何实现任意键退出暂停等功能呢,我当时也没有多想,因为接触python时间也不算长,主要还是Linux下的。

要实现该功能,需要的就是暂停程序、等待并捕捉用户的一个键盘输入,然后继续执行。Python 有内建的库能帮我们实现该功能,不过要区别对待 Windows 和 Linux。

当然,Windows系统下会稍微简单一些,Windows系统下如果你安装了python的环境,默认自带的一个模块叫做msvcrt,import msvcrt,然后调用msvcrt.getch()即可。

1、按回车键退出。

#coding=utf-8
raw_input(unicode('按回车键退出...','utf-8').encode('gbk'))

2、按任意键继续。

import os
os.system('pause')

接下来即Linux下实现python版本的按任意键退出。

初学Python时在总想实现一个按任意键继续/退出的程序(受.bat毒害), 奈何一直写不出来, 最近学习Unix C时发现可以通过 termios.h 库来实现, 尝试一下发现Python也有这个库, 所以终于写出一个这样的程序. 下面是代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os
import sys
import termios

def press_any_key_exit(msg):
  # 获取标准输入的描述符
  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

  # 输出信息
  sys.stdout.write(msg)
  sys.stdout.flush()
  # 使设置生效
  termios.tcsetattr(fd, termios.TCSANOW, new_ttyinfo)
  # 从终端读取
  os.read(fd, 7)

  # 还原终端设置
  termios.tcsetattr(fd, termios.TCSANOW, old_ttyinfo)

if __name__ == "__main__":
  press_any_key_exit("按任意键继续...")
  press_any_key_exit("按任意键退出...")

其他关于 termios 的信息可以参考Linux手册:

man 3 termios

另补充一下*nix终端的三种模式(摘自<Unix-Linux编程实践教程>)

规范模式

规范模式, 也被成为cooked模式, 是用户常见的模式.驱动程序输入的字符保存在缓冲区, 并且仅在接收到回车键时才将这些缓冲的字符发送到程序.缓冲数据使驱动程序可以实现最基本的编辑功能, 被指派这些功能的特定键在驱动程序里设置, 可以通过命令stty或系统调用tcsetattr来修改

非规范模式

当缓冲和编辑功能被关闭时, 连接被成为非规范模式.终端处理器仍旧进行特定的字符处理, 例如处理Ctrl-C及换行符之间的转换, 但是编辑键将没有意义, 因此相应的输入被视为常规的数据输入 程序需要自己实现编辑功能

raw模式

当所有处理都被关闭后, 驱动程序将输入直接传递给程序, 连接被成为raw模式.

Python 相关文章推荐
python开发的小球完全弹性碰撞游戏代码
Oct 15 Python
Mac OS X10.9安装的Python2.7升级Python3.3步骤详解
Dec 04 Python
python遍历类中所有成员的方法
Mar 18 Python
python中requests库session对象的妙用详解
Oct 30 Python
python 产生token及token验证的方法
Dec 26 Python
djang常用查询SQL语句的使用代码
Feb 15 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
Apr 26 Python
pandas 数据结构之Series的使用方法
Jun 21 Python
Django的Modelforms用法简介
Jul 27 Python
用python实现名片管理系统
Jun 18 Python
Python爬虫爬取糗事百科段子实例分享
Jul 31 Python
pycharm激活方法到2099年(激活流程)
Sep 22 Python
Linux 下 Python 实现按任意键退出的实现方法
Sep 25 #Python
利用Python为iOS10生成图标和截屏
Sep 24 #Python
使用Python多线程爬虫爬取电影天堂资源
Sep 23 #Python
Python 爬虫模拟登陆知乎
Sep 23 #Python
python 自动化将markdown文件转成html文件的方法
Sep 23 #Python
Python增量循环删除MySQL表数据的方法
Sep 23 #Python
教你用Python脚本快速为iOS10生成图标和截屏
Sep 22 #Python
You might like
php中函数的形参与实参的问题说明
2010/09/01 PHP
php不允许用户提交空表单(php空值判断)
2013/11/12 PHP
PHP AjaxForm提交图片上传并显示图片源码
2016/11/29 PHP
html+javascript实现可拖动可提交的弹出层对话框效果
2013/08/05 Javascript
7个有用的jQuery代码片段分享
2015/05/19 Javascript
jQuery实现简单的图片查看器
2020/09/11 Javascript
jquery实现点击弹出可放大居中及关闭的对话框(附demo源码下载)
2016/05/10 Javascript
Javascript将双字节字符转换成单字节字符并计算长度
2016/06/22 Javascript
浅谈JS之tagNaem和nodeName
2016/09/13 Javascript
AngularJS 单元测试(一)详解
2016/09/21 Javascript
Vue.js 2.0窥探之Virtual DOM到底是什么?
2017/02/10 Javascript
微信小程序视图template模板引用的实例详解
2017/09/20 Javascript
深入理解JS中Number(),parseInt(),parseFloat()三者比较
2018/08/24 Javascript
javascript实现倒计时效果
2020/02/17 Javascript
如何管理Vue中的缓存页面
2021/02/06 Vue.js
[01:18]一目了然!DOTA2DotA快捷操作对比第一弹
2014/07/01 DOTA
Python内置数据类型详解
2014/08/18 Python
python查找目录下指定扩展名的文件实例
2015/04/01 Python
浅谈python中拼接路径os.path.join斜杠的问题
2018/10/23 Python
python实现五子棋小游戏
2020/03/25 Python
详解Python安装tesserocr遇到的各种问题及解决办法
2019/03/07 Python
python打开windows应用程序的实例
2019/06/28 Python
pymysql模块的使用(增删改查)详解
2019/09/09 Python
python保存log日志,实现用log日志画图
2019/12/24 Python
Python:__eq__和__str__函数的使用示例
2020/09/26 Python
美国最流行的男士时尚网站:Touch of Modern
2018/02/05 全球购物
高中生学习生活的自我评价
2013/11/27 职场文书
班级入场式解说词
2014/02/01 职场文书
党的群众路线教育实践活动学习心得体会
2014/03/03 职场文书
房屋出售协议书
2014/04/10 职场文书
体育系毕业生求职自荐信
2014/04/16 职场文书
精神文明建设汇报材料
2014/12/24 职场文书
2016重阳节红领巾广播稿
2015/12/18 职场文书
2019幼儿园感恩节活动策划书
2019/11/28 职场文书
vue基于Teleport实现Modal组件
2021/05/31 Vue.js
Java8利用Stream对列表进行去除重复的方法详解
2022/04/14 Java/Android