python显示小数点后几位数_python窗口编程-3:数位处理(整数)

我们在上一次课程中(python窗口编程-2:风格与布局 ),制作了完整的计算器窗口界面,只是那个窗口没有真正的功能,是点击任何按钮都会关闭。这一次,我们加入一些事件处理的功能,让它成为一个正常工作的窗口程序,并具备与普通的计算器一样的输入数字的操作能力。

a36f127545327f69b99812c8c6037c68.png

事件处理的无限循环

为了避免点击按钮会关闭窗口,我们引入无限循环的事件处理:

while True:                                     event, values = window.read()     if event==sg.WIN_CLOSED:        breakwindow.close()

使用这个代码,替换上次课程最后的两行代码。我们会看到,现在只有点击窗口右上角的“X”才能关闭窗口,点击其它的按钮虽然没有反应,但不会导致窗口的关闭了。

sg.WIN_CLOSED代表关闭窗口的按钮值,实际是None,但这样表达增强了代码的健壮性。如果有一天PySimpleGUI的新升级版决定修改关闭窗口的按钮值,我们的代码无须做任何修改(理应如此)。

凡是有无限循环的地方,都必须有退出循环的机制,否则程序无法终止。那将是一个很不友善的用户体验。这里的break语句,作用就是退出循环。

break不但用于while循环,也可以用于for循环。当遍历搜索一个数据时,找到数据并且无须继续搜索时,就可以用break退出循环。

数字键的处理

当按钮为数字的时候,我们这样表示

event in [str(i) for i in range(0,10)]:

这里又用到了列表生成式,我们在编程基础的课程中讲过(python语言基础-10:编程是一种艺术 ),含义是当事件为‘0’到‘9’几个数字的时候。

需求分析

很多软件产品的开发,并没有细致的需求描述,而是提供了一个参考原型。即:这个功能参考XXX进行开发。比如我们的计算器,按下按钮的反应究竟应该是怎样,来自对真实计算器的模拟。我们第一步的需求,只实现正常的数字输入功能。

7d877a39d1aa0ba96f6a6c8e59fc6bd8.gif

计算器的操作,对很多朋友来说是很熟悉也很自然的。最好的操作界面设计,就应该是自然的,让用户无须培训,就能自然使用。我们用语言来描述一下。

  1. 计算器的输出框,永远不会是空白,它的默认状态就是一个0后面跟一个小数点。
  2. 输入数字,就开始增加整数的位数,但首位不会是0。
  3. 输入小数点,显示不会立刻改变,但后面再输入数字,就变成了小数的位,末尾可以是0。

本节课程,只实现前两个功能(的一部分)。

整数数位逻辑

为了实现功能2,让我们看一下基本的整数位逻辑。新输入的数字会改变原有数字的含义。新的数字占据个位,原来的个位变成十位,原来十位变成百位,依此类推。这个操作,在编程中,用一个简单的模式来表现:

Value= Value* 10+ NewDigit

程序语言,真的是一种语言,一句代码,就能把这个操作逻辑描述得清清楚楚。能够看懂并理解程序语言,这就是掌握编程的开始。

内部值与显示值的分离

我们注意到,计算器的显示,是数字后面跟着一个小数点。正常的数字转字符串不是这样的效果,我们必须人为地在后面添加一个小数点。

ShowStr= str(Value)+'.'

在这种操作逻辑下,将内部计算用的值与显示的效果分开是好的。它的好处体现在控制了复杂性的规模。编程活动不创造有形的物质,它的价值就在于控制复杂性。

更加明确的说,好的编程者的能力就体现在开发代码的全过程中始终把复杂性规模维持在自己能够控制的范围之内,并以此实现整体看起来相当复杂的功能逻辑

(这里对比一下,交易的价值就在于控制风险。优秀的交易者,能够把交易风险限制在自己能够控制的范围之内,并以此为基础承担一般人整体看起来相当大的风险,从而获得风险利益。)

控制复杂性规模的一个方法,就是将可以分开的功能尽量分开。我们可以集中注意力思考如何通过按钮事件对内部值的改变时,可以不考虑显示的问题。而在处理显示的时候,只需集中注意力考虑它的静态状态,不用考虑它的变化。

(这与打仗的原理是一样的,在局部集中优势兵力对敌。)

最后贴一下局部实现的代码

value= 0while True:                                     event, values = window.read()     if event==sg.WIN_CLOSED:        break    if event == 'C':        value= 0    elif event == '±':        value= -value    elif event in [str(i) for i in range(0,10)]:        value= value* 10+ int(event)    info= str(value)+'.'    info=info[-12:]    window['show'].update(info)window.close()

这里还有几个小的处理逻辑

  • C按钮的处理,直接将内部值设置为0
  • ±按钮的处理,内部值正负切换
  • 为了美观起见,数字的显示只保留最后的12位
  • 改变文本框的显示,用update函数,它提供了窗口界面的输出功能。
  • 文本框的定位,用了它的名字(key),这里的key与前面课程中讲的key,功能含义完全不同,别弄混了。同名不同含义的问题,在自然语言和编程语言中都大量存在,这经常是引起各种混淆和争论的起因。我们从一开始就应当给予足够的重视。

课程小结

本节课程,介绍了如何开发一个真正的窗口应用,在窗口中响应输入,显示输出,完全脱离控制台的黑窗口。并讲了数位处理的基本逻辑,这在数学编程中是很常用的。

简单介绍了通过功能分离来控制编程复杂性的方法,控制复杂性将是贯穿编程的学习和实践的全过程,后面还会经常讲到。

朋友们可以自行尝试一下如何实现小数,下一次课程中再解说。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272082.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux文件目录基础笔记

1、进入目录名称:cdcd命令主要是方便用户切换到不同目录的指令。比如:cd #只执行cd命令默认进入root的根目录cd /home #进入home目录,如果home目录有testdir目录的话,可以执行 cd testdir 进入testdir目录。2、创建目录命令&#…

eclipse安卓工程的构建、配置连接模拟器、安卓工程结构介绍

安卓工程构建及第一个安卓程序运行: 首先新建安卓工程: 然后填写APP信息,下面的包名一般都是公司域名的倒写,包名中不能有中文,否则会报错。 然后配置一些安卓app的选项 有关app启动的图标(就像QQ的企鹅一…

Linux中su和sudo的用法整理

一、为什么会有su和sudo命令?主要是因为在实际工作当中需要在Linux不同用户之间进行切换。root用户权限最高很多时候需要root用户才能执行一些关键命令。所以需要临时切换为root用户。工作完成后,考虑到系统的安全性避免误操作需要切换为普通用户。su和s…

codeforces 650B - Image Preview

题意:给你n个照片,从第一个照片开始看,如果一张照片是w,那么要花费b时间去反转他,否则不用反转,看一张从来没看过的照片要1时间, 从一张滑动到另一张要a时间。如果一张照片看过,则不…

asp js单步调试_如何使用Chrome的控制台高效的调试Javascript代码?

引言在我们的日常开发中我们常常会遇到JavaScript的调试问题,而我们解决问题的传统解决方案就是使用大量的console.log或者console对象的其他方法,这会给我们带来很多不便,特别是遇到复杂问题的时候,可能会出现大量的console.log&…

安卓App的启动过程、安卓布局分类及布局和页面的关系

Android App 启动流程: 当你想要启动一个app时,首先得点击该app桌面图标。那点击图标时到底发生了什么呢?先看个理论知识 .Launcher: launcher其实就是一个app,从功能上说,是对手机上其他app的一个管理和启动,从代码…

Linux文件默认权限和umask笔记

关于Linux文件默认权限的问题,可以实际先尝试一下如下命令:root用户登录[rootlocalhost test]# touch file1[rootlocalhost test]# ls-l file1-rw-r--r-- 1 root root 0 May 5 08:28 file1 #输出结果 对应的数字权限 644[rootlocalhost test]# touch fi…

Android相对布局(RelativeLayout)常用属性、练习使用按键、文本框等控件、线性布局(LinearLayout)属性

RelativeLayout中子控件常用属性: 子控件默认是从父控件的左上角开始排列的 相对于父控件 android:layout_alignParentTop"true" 和父控件的顶部对齐android:layout_alignParentBottom"true" 和父控件的底部对齐android:layout_alignPar…

Seata AT模式

基本思路 先决条件 支持本地ACID事务的关系数据库。通过JDBC访问数据库的Java应用程序。 整体机制 从两个阶段提交协议的演变: 阶段1:在同一本地事务中提交业务数据和回滚日志,然后释放本地锁和连接资源。阶段2: 对于提交情况…

自媒体各大平台收益对比_哪些自媒体平台没有新手期,适合小白撸收益?

2-26把我设置为星标,不错过每一次的干货~各大自媒体平台的新手期总是让小白们望而却步,特别是百家号审核非常严格,如果没思路、没人指导,过新手有难度。不过,还是有很多平台对新手宝宝很友好,没…

Linux关于文件的权限笔记

1、调整文件的权限命令:chmodLinux的每个文件都定义了文件的拥有者:u(user)、拥有组:g(group)、其他人:o(others)权限,对应的权限用rwx的组合来定义。使用chmod命令&…

启动rrt什么意思_python学习第144课--创建虚拟机、设置虚拟机参数以及启动虚拟机...

【每天几分钟,从零入门python编程的世界!】上节我们介绍了下载虚拟机以及centOS的相关事项,现在我们创建虚拟机。●创建虚拟机安装好virtualbox之后,我们点击Oracle VM VirtualBox打开管理器,界面如下图:你…

Android按键响应的几种方式、安卓页面的跳转、页面跳转传参、页面自动跳转、Activity(页面)的生命周期

按键响应的第一种方式: 在XML文件里面设置按键的onClick绑定函数。就像下面的代码,给Button设置onClick属性,在按键被按下的时候,会调用java文件里面的onClickbtton1这个函数,因为现已将它和这个按钮进行了绑定。利用…

pycharm体验

查看python版本 退出 exit()

Linux文本检索命令grep笔记

grep是在linux系统中基于行文本非常实用检索工具,通过该命令可以将匹配到的结果信息输出到终端控制台。语法格式:grep [-ivnc] 需要匹配的内容 文件名常用参数说明:-i 检索的时候不区分大小写-c 检索到的匹配行数-n 检索到的匹配行显式具体的…

成立出版社的条件_创始人亲述:法国鸿飞文化出版社的诞生故事和做书心得

鸿飞文化出版社2007年在法国创立,专门出版由中国作家和法国插画师共同创作的图画书。创始人叶俊良引用苏东坡的诗句“人生到处知何似,应似飞鸿踏雪泥。泥上偶然留指爪,鸿飞那复计东西。”为出版社取名,希望通过这些“印迹”为读者…

python单行注释和多行注释

# 后面加一个空格,下面就不会有波浪线了 点击小灯泡下的第一行,可以调整注释格式 多行注释

Linux文件查询笔记

1、数据库查找命令:locateLinux也可以通过locate命令查找文件,locate命令主要是依据一个数据库文件来执行文件的查找,默认情况下Linux每天会默认检索系统中的所有文件,然后把检索的文件信息记录到数据库文件中。因为运行locate命令…