实现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 相关文章推荐
高性能web服务器框架Tornado简单实现restful接口及开发实例
Jul 16 Python
Python实现针对中文排序的方法
May 09 Python
Python错误: SyntaxError: Non-ASCII character解决办法
Jun 08 Python
Vue的el-scrollbar实现自定义滚动
May 29 Python
Python实现将Excel转换成为image的方法
Oct 23 Python
python pygame实现方向键控制小球
May 17 Python
Python3日期与时间戳转换的几种方法详解
Jun 04 Python
python set集合使用方法解析
Nov 05 Python
pd.DataFrame统计各列数值多少的实例
Dec 05 Python
python如何删除列为空的行
Jul 17 Python
Python进行统计建模
Aug 10 Python
python自动化测试通过日志3分钟定位bug
Nov 20 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 模拟POST|GET操作实现代码
2010/07/20 PHP
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
2018/09/03 PHP
PHP观察者模式实例分析【对比JS观察者模式】
2019/05/22 PHP
js 加载并解析XML字符串的代码
2009/12/13 Javascript
xml文档转换工具,附图表例子(hta)
2010/11/17 Javascript
基于jQuery实现图片的前进与后退功能
2013/04/24 Javascript
js函数定时器实现定时读取系统实时连接数
2014/04/30 Javascript
javascript制作的cookie封装及使用指南
2015/01/02 Javascript
Jquery实现地铁线路指示灯提示牌效果的方法
2015/03/02 Javascript
jquery实现简单的二级导航下拉菜单效果
2015/09/07 Javascript
基于javascript制作微博发布栏效果
2016/04/04 Javascript
js canvas实现擦除效果示例代码
2017/04/26 Javascript
使用webpack3.0配置webpack-dev-server教程
2018/05/29 Javascript
vue 动态绑定背景图片的方法
2018/08/10 Javascript
react+redux仿微信聊天界面
2019/06/21 Javascript
在vue中嵌入外部网站的实现
2020/11/13 Javascript
[57:41]Secret vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[01:07:19]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第一场 1月19日
2021/03/11 DOTA
python概率计算器实例分析
2015/03/25 Python
使用python求解二次规划的问题
2020/02/29 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
2020/03/23 Python
使用Python三角函数公式计算三角形的夹角案例
2020/04/15 Python
python中return如何写
2020/06/18 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
2020/07/18 Python
Python字典fromkeys()方法使用代码实例
2020/07/20 Python
scrapy redis配置文件setting参数详解
2020/11/18 Python
css3实现3d旋转动画特效
2015/03/10 HTML / CSS
迪奥美国官网:Dior美国
2019/12/07 全球购物
英国女性化妆品收纳和家具网站:Beautify
2019/12/07 全球购物
学期自我鉴定范文
2013/10/01 职场文书
实习评语
2013/12/16 职场文书
心理健康活动总结
2014/04/30 职场文书
优秀德育工作者事迹材料
2014/05/07 职场文书
党员先锋岗事迹材料
2014/05/08 职场文书
医学生求职自荐书
2014/06/12 职场文书