书名:青少年编程魔法课堂Python图形化创意编程
ISBN:978-7-115-58443-4
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 张新华 谢春玫 梁靖韵 著
责任编辑 赵祥妮
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
读者服务:
微信扫码关注【异步社区】微信公众号,回复“e58443”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。
这是一本专为没有编程基础的青少年读者编写的Python入门图书,即使是小学生也可以轻松阅读本书。
全书包含十几个短小精悍且趣味十足的程序,采用面向对象程序设计,通过可视化与游戏化相结合的编程实践,使读者轻松进入Python的奇妙世界。
编委会主任:严开明
编委会委员:张新华 伍婉秋 葛 阳 徐景全 谢春玫
梁靖韵 刘路定 黎旭明 热则古丽
为了更好地与其他人交流,我们需要学习人类的语言;为了更好地与计算机交流,我们需要学习计算机的语言——编程语言。如果我们不懂编程语言背后的计算思维和编程逻辑,就不能很好地理解计算机,不能充分地利用计算机为我们服务。
对于初学者来说,将Python作为入门编程语言是一个很好的选择,因为它易于学习,功能强大。Python被广泛应用在人工智能、科学计算、大数据、金融、系统运维、图形处理、文本处理、网络爬虫等领域,全世界有很多人正在使用Python从事科研和软件开发工作。
虽然学习Python的优势非常明显,但是对于初学者来说,它的缺点也是显而易见的。
(1)Python及其默认的集成开发环境界面——IDLE,均是全英文的,这对尚不熟练英文的初学者来说是不小的学习障碍。
(2)Python环境配置复杂,为了实现某些功能,经常需要下载安装相应的模块,这些模块的安装需要手动输入复杂的语句实现。
(3)以Visual Basic、Visual C++为代表的编程语言在很多年前就已经进入了“图形化界面设计、所见即所得”的“视窗”时代,但目前却很难找到一个适合Python初学者使用的简单可视化界面设计工具。
为了解决初学者遇到的这些问题,我们使用Python开发了基于图形化界面设计的全中文Python开发环境——Visual Python。该软件是全国教育科学“十三五”规划2019年度教育部重点课题“中小学智能实验教学系统的构建与应用实践研究”(DCA190327)子课题的研究成果。
它不仅能通过简单的操作配置好令初学者头疼的Python环境,更令人惊喜的是,初学者仅用鼠标“绘制”就能生成专业的Windows程序界面,这使得初学者摆脱了繁杂、低效的界面设计过程,将精力更有效地集中于逻辑代码的实现过程。
基于Visual Python,我们精选了十几个趣味性很强的程序汇编成本书,这些程序的代码简短且易于实现,大大降低了学习难度,非常适合Python入门培训或初学者自学。更进一步地,我们还努力尝试在教学方法和教学理论上有所创新,主要体现在以下几个方面。
(1)抛弃了“简陋”的字符界面编程,直接学习主流的Windows图形界面编程。
(2)抛弃了多数Python入门教材中仍然停留在面向过程程序设计范型的教学思路,直接采用面向对象程序设计(Object Oriented Programming,OOP)的教学思路,使学习者能够紧跟技术潮流,减少无谓的学习成本。
(3)尽量避免传统编程学习过程中的枯燥无聊状态,通过新颖有趣的游戏式编程,学习者将在充满想象和激情的创造性学习过程中,轻松掌握Python的使用。
(4)为方便教学,书中的每一课均设计为在一个课时内完成。每节课的“准备知识”“界面设计”“代码编写”部分是学习者课内必须完成的基础模块,“动手实践”和“扩展任务”部分是针对课堂任务完成较快的学习者设计的选学模块,“课后练习”部分是思考总结的提升模块。希望这样的编排方式可以让感兴趣的读者进一步探索本书内容。
亲爱的读者们,请跟随本书进入崭新的Visual Python图形化编程世界,一起创造精彩又有趣的Windows程序,体验不一样的编程快乐吧!
张新华
2022年4月
Python是一种跨平台、开源、解释型的高级语言,它易于学习,功能强大,于1991年推出后迅速获得各行各业的关注,并得到了广泛的应用。
但作为Python初学者,我想你多半会有这样的疑惑:都21世纪了,为什么Python代码的运行界面仍旧是图0.1(a)这样“远古时代”简陋的控制台窗口呢?为什么不能像图0.1(b)一样,显示标准的Windows图形化界面,有按钮、图像、动画……
◎图0.1
另外,如图0.2所示,如果不小心写错了代码,运行程序时输出的错误提示信息全是英文,完全看不懂需要怎么修改,这种情况怎么办呢?
◎图0.2
现在好了,打开网页浏览器,输入网址“www.magicoj.com”,下载并安装图0.3所示的Visual Python套装软件,我们就可以:
(1)告别“简陋”的控制台窗口,轻松设计出漂亮的图形化界面;
(2)使用全中文代码编辑器IDLE++,运行程序时输出的错误提示信息也是中文的;
(3)轻松实现各种炫酷效果,就连人脸检测与识别也能通过几行代码实现。
◎图0.3
怎么样,心动了吗?那就安装好Visual Python,开启我们奇妙的图形化Python编程之旅吧。
安装好Visual Python后,双击图标打开Visual Python,工作界面如图0.4所示。
◎图0.4
我们可以调整窗体设计区的位置和大小。在窗体设计区的空白处按住鼠标滚轮,当鼠标指针的形状变为时,拖动鼠标,将窗体设计区往屏幕的左上方略微移动(窗体设计区显示在屏幕上的位置就是运行时程序窗体显示的位置),如图0.5所示。
◎图0.5
将鼠标指针移到窗体设计区的右下角,当鼠标指针的形状变为时,按住鼠标左键拖动窗体设计区,即可调整窗体设计区的尺寸,如图0.6所示。
◎图0.6
我们可以很方便地用鼠标在窗体设计区绘制Python程序的界面。
以绘制输入框为例,首先在控件箱中选中欲绘制的控件,只要在相应的控件上单击即可。控件的文字颜色变为红色即表示该控件已被选中,如图0.7所示。
◎图0.7
在窗体设计区的合适位置按住鼠标左键,拖动鼠标指针到合适位置后松开鼠标左键,即可绘制出该控件(单击鼠标右键可删除绘制好的控件),如图0.8所示。
◎图0.8
如果绘制好的控件位置不合适,可以在该控件上按住鼠标左键将其拖动到合适位置(选中控件后,使用键盘上的方向键也可以移动该控件)。
如果绘制好的控件尺寸不合适,可以将鼠标移到该控件的右侧,当鼠标指针变为时,按住鼠标左键拖动控件调整尺寸。
界面设计好后,单击按钮,在弹出的对话框中选择文件保存位置,在“文件名”输入框中输入程序名,例如“我的第一个程序”,单击“保存”按钮,将其保存为模块(Module)文件,如图0.9所示。
◎图0.9
此时Visual Python的界面将以最小化的方式隐藏,同时打开Python代码编辑器——IDLE++。IDLE++是基于Python默认代码编辑器IDLE的深度汉化改进版。IDLE++显示自动生成的代码如图0.10所示。
◎图0.10
我们可以将动画示例代码删除并替换为自己写的代码,或者如图0.11所示,预先在Visual Python的面板中将包含示例代码的选项设置为“否”,这样以后自动生成的代码中都不会再包含示例代码。
◎图0.11
IDLE++中几乎所有的英文均已汉化,甚至绝大多数的错误提示信息也是中文,这更有利于初学者调试代码,如图0.12所示。
◎图0.12
单击按钮执行代码,一个绘制好控件的窗体出现了,如图0.13所示。
◎图0.13
在保存模块文件的目录下,还生成了一个名为“GUI_我的第一个程序.pyw”的辅助文件,如图0.14所示。它保存了界面设计和一些功能实现代码,是模块文件正常运行的保证。注意,这两个文件的名称一经确定,就不能随意修改,否则程序将无法运行。
◎图0.14
微信扫码关注【异步社区】微信公众号,回复“e58443”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。
本课我们将使用字符绘制出类似图1.1所示的字符画。
◎图1.1
我们将学到的主要知识点如下。
(1)输出函数print()和Print()的使用。
(2)函数的概念。
(3)代码的缩进格式要求。
(4)注释语句的使用。
(5)Python文件的保存格式。
(6)播放音符函数play()的使用。
Python由荷兰人吉多•范罗苏姆(Guido van Rossum)发明。他认为当时已有的编程语言对非计算机专业的人员十分不友好,于是在1989年12月,为了打发无聊的圣诞节假期,吉多开始写Python的第一个版本。“Python”这个名字来自吉多喜爱的电视连续剧《蒙蒂蟒蛇的飞行马戏团》。他希望新的语言Python能够具有创建全功能、易学、可扩展的特性。
Python崇尚优美、清晰、简单,是一门优秀并被广泛使用的语言。有人说,完成一个相同的任务,使用汇编语言需要1000行代码,使用C语言需要500行代码,使用Java需要100行代码,而使用Python可能只要20行代码。
Python自问世以来,迅速成为一门流行的编程语言,越来越多的公司和机构选用Python作为其主要开发语言。例如:
Google的Google App Engine、code.google.com、Google Earth、Googlebot、Google Ads等项目大量使用Python进行开发;
美国国家航空航天局(NASA)大量使用Python进行数据分析和运算;
视频网站YouTube就是用Python开发的;
在线云存储网站Dropbox的功能全部用Python实现,网站每天处理约10亿个文件的上传和下载;
图片分享社交网站Instagram的功能全部用Python开发,网站每天有超过3000万张照片被分享;
社交网站Facebook的大量基础库通过Python实现;
Linux发行版本Redhat中的yum包管理工具就是用Python开发的;
豆瓣公司几乎所有的业务用Python开发;
国内的问答社区知乎是用Python开发的;
在线医疗网站春雨医生是用Python开发的。
除此之外,搜狐、金山、腾讯、网易、百度、阿里巴巴、新浪、果壳等公司都使用Python来完成各种各样的任务。
打开Visual Python,单击窗体设计区上方的按钮,在“窗口设置”中,设置“窗体名称”为“奇妙的字符画”,设置“窗体颜色”为喜欢的颜色,设置窗体全屏,单击“应用”按钮,如图1.2所示。
◎图1.2
单击按钮,在弹出的对话框中选择文件保存位置,在“文件名”输入框中输入“字符画”,单击“保存”按钮,将其保存为模块文件。
以.py结尾的Python文件双击后不能直接运行,它通常会直接被Python编辑器(例如IDLE++)打开。
以.pyw结尾的Python文件双击后可以直接运行,就好像运行Windows的可执行文件一样。当然,它仍然可以用IDLE++打开。
可以事先在Visual Python的“设置”面板中设置默认保存类型是.py或.pyw。
保存模块文件后,Visual Python的界面将以最小化的方式隐藏,同时打开IDLE++。如图1.3所示,可以看到有一段示例代码放在“Init()”之后,这种语句以def开头,以冒号(:)引出代码块,我们称这种代码块为函数,“Init”即为函数名。这么做使得代码更加简单易懂,因为我们可以用这种方式将复杂的任务分解为一个个代码块。
◎图1.3
函数是指能完成一定功能的代码块,Init()函数是Visual Python特有的自定义函数。“init”的中文含义是“初始化”。
Visual Python规定程序运行时,首先执行Init()函数内的代码,所以通常将一些需要在程序初始运行时执行的代码放在Init()函数中。
Python有许多内置函数,我们可以调用它们使程序变得简洁。
你注意到每一行代码后面的符号“#”和中文说明了吗?“#”符号表示该部分为注释语句。注释语句起到备注作用,是对代码的解释和说明,它可以帮助初学者更快速地理解代码的含义。Python解释器在执行代码时会忽略注释语句,不对它做任何处理,就好像它不存在一样。
在不修改任何代码的情况下,直接单击IDLE++的按钮运行程序,示例代码会在窗体上展示一段动画以供初学者学习参考(此段代码可替换为我们自己编写的代码),如图1.4所示。
◎图1.4
计算机的“大脑”是CPU,中文名是中央处理器。它不能直接执行Python代码,只能执行由0和1组成的机器语言。
所以,我们需要一个翻译工具,把Python代码翻译成计算机能“听懂”的机器语言,这样计算机才能按照Python代码的要求去“做事”,这个翻译工具就是Python解释器。
单击IDLE++中的2运2行模块按钮,实际是调用Python解释器去读取Python代码,再将其翻译成机器语言,从而告诉计算机如何做。其工作原理如图1.5所示。
◎图1.5
删除Init()函数里的示例代码,输入如下代码。注意除双引号内的中文外,其他字符均为半角。此外,Python是严格区分大小写的,print和Print是不一样的。
def Init(): # 初始化函数
print("这是我的第一个Python程序")
print("我的心情很激动")
print("我希望它能够一次运行成功")
print("因为传说中,第一个程序如果能一次运行成功")
print("那么在以后的学习过程中,就会无往不利")
注意输入的每行语句前有4个空格,因为Python采用代码缩进和冒号(:)来区分代码块之间的层次。
Python默认用4个空格作为一个缩进量(在默认情况下,按一次Tab键就输入4个空格)。
Python对代码的缩进要求非常严格,同一级别代码块的缩进必须一样,否则Python解释器会报语法异常错误(SyntaxError)。
print()用于输出括号内的内容,是Python中最常见的一个函数。
代码写好后单击按钮保存,再单击按钮运行,如果代码没有错误,运行结果如图1.6所示。
◎图1.6
可以看到,print()逐行在控制台窗口输出了双引号内的文本内容(这种用双引号或者单引号括起来的文本内容称为字符串),且一行输出结束后自动换行。字符串的内容必须包含在两个双引号或两个单引号内。字符串可以包含英文、数字、中文以及各种符号。
Visual Python新增了一个可以在窗体上显示字符串的函数Print(),例如Print("我可以在窗体上显示哦"),还可以设置输出字符串的前景色和背景色。例如,设置输出字符串的字体颜色为红色、背景色为蓝色的语句为Print("字符串内容","red","blue")。
若设置了字符串的输出坐标,则该行输出不占用正常输出语句的位置。例如:
(1)设置字符串的输出坐标为(50,100)的语句为Print("字符串内容",x=50,y=100);
(2)既设置字符串的输出坐标,又设置字符串的字体颜色为红色、背景色为绿色的语句为Print("字符串内容",fgcolor="red",bgcolor="blue",x=120,y=150)。
颜色的定义可参照附录D,注意颜色代码均为字符串,必须包含在两个双引号或两个单引号内。
下面的代码用于绘制一幅心形字符画,输出效果如图1.7所示。现在发挥你的创造力,绘制出更漂亮的字符画吧。
def Init(): # 程序运行时就执行一次的初始化函数
Print(" ****** ******",fgcolor="red",x=100,y=10)
Print(" ********** *********",fgcolor="red",x=100,y=20)
Print(" ************************",fgcolor="red",x=100,y=30)
Print(" ************************",fgcolor="red",x=100,y=40)
Print(" ************************",fgcolor="red",x=100,y=50)
Print(" ************************",fgcolor="red",x=100,y=60)
Print(" ***********************",fgcolor="red",x=100,y=70)
Print(" *********************",fgcolor="red",x=100,y=80)
Print(" *******************",fgcolor="red",x=100,y=90)
Print(" *****************",fgcolor="red",x=100,y=100)
Print(" ***************",fgcolor="red",x=100,y=110)
Print(" *************",fgcolor="red",x=100,y=120)
Print(" ***********",fgcolor="red",x=100,y=130)
Print(" *********",fgcolor="red",x=100,y=140)
Print(" *******",fgcolor="red",x=100,y=150)
Print(" *****",fgcolor="red",x=100,y=160)
Print(" ***",fgcolor="red",x=100,y=170)
Print(" *",fgcolor="red",x=100,y=180)
◎图1.7
在开始学音乐时,老师都会教我们唱“do re mi fa so la si”,在音乐中它们是非常重要的7个音。基本的C大调音阶就是由它们组成的,如图1.8所示。
◎图1.8
在Visual Python中可以通过编程将这7个音用高音、中音、低音的方式来播放。例如,play("1",400)表示播放中音“do”400毫秒(1秒=1000毫秒);play("+2",400) 表示播放高音“re”400毫秒;play("-3",400) 表示播放低音“mi”400毫秒。
试从网上找一段简单的乐谱,编写代码,使程序既能显示字符画,又能播放一段音乐。
在 Python 中字符串也可以使用三个单引号或三个双引号来表示字符串,这样字符串中的内容就可以多行书写,并且被多行输出。
例如输出如下一段古诗文的代码。
Text="""
观沧海
东临碣石,以观沧海。
水何澹澹,山岛竦峙。
树木丛生,百草丰茂。
秋风萧瑟,洪波涌起。
日月之行,若出其中;
星汉灿烂,若出其里。
幸甚至哉,歌以咏志。
"""
def Init():
Print(Text,bgcolor='red') # 输出之前定义的字符串Text,注意不要加引号
如图1.9所示,网络上有一些免费的在线生成ASCII字符画的网站,例如https://tools.kalvinbg.cn/image/asciiPic等,试选择喜欢的图片生成字符画后,使用Print()绘制到窗体上。
◎图1.9
微信扫码关注【异步社区】微信公众号,回复“e58443”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。
本课我们将制作一个如图2.1所示的简单计算器,用于计算复杂的数学表达式。
◎图2.1
我们将学到的主要知识点如下。
(1)数值的类型。
(2)算术运算符的使用。
(3)数据类型的强制转换。
(4)控件的事件驱动的添加。
(5)字符串和数值的区别。
(6)对象、属性、方法和事件驱动的概念。
(7)字符串连接符“+”的使用。
(8)type()、get()、delete()、insert()、eval()的使用。
上一课我们使用print()函数在屏幕上输出了各种各样的字符串(string)。除了字符串类型外,Python还定义了许多其他的数据类型,例如数值的类型有整型和浮点型:
(1)整型(int)数值就是平时所见的整数,如-1、2、-3、4、100、1200等;
(2)浮点型(float)数值就是平时所见的小数,如3.14是浮点型数值,1.0也是浮点型数值。
Python区分整型和浮点型的唯一方式,就是看有没有小数点。
通过函数type()可以输出数据的类型,例如运行以下代码。
print(type("字符串"))
print(type(100))
print(type(3.14))
输出结果如下。
<class 'str'>
<class 'int'>
<class 'float'>
Python可以对整型和浮点型数值进行算术运算,Python的算术运算符及其含义和说明如表2.1所示。
表2.1 Python的算术运算符及其含义和说明
运算符 |
含义 |
说明 |
---|---|---|
+ |
加号 |
两数相加,例如2+3的值为5 |
- |
减号 |
两数相减,例如2-3的值为-1 |
* |
乘号 |
两数相乘,例如2*3的值为6 |
/ |
除号 |
两数相除,结果为浮点数,例如3/2的值为1.5 |
% |
取余 |
两数相除,结果取余数部分,例如5%3的值为2 |
** |
幂运算 |
求ab的值,例如2**3的值为8 |
// |
整除 |
两数相除,结果仅取整数部分,例如3//2的值为1 |
( ) |
圆括号 |
和数学运算规则一样,圆括号内的表达式优先计算 |
Python以圆括号代替数学中的方括号和花括号运算符,程序运行时将按由内到外的顺序计算圆括号里表达式的值。例如数学表达式2×{4-[3-(2-9)]},将其转化成Python的表达式为2*(4-(3-(2-9)))。
Python除了圆括号里表达式的计算最优先外,其余运算优先次序如下。
(1)幂运算。
(2)乘法、除法、取余、整除,依照出现顺序运算。
(3)加法、减法,依照出现顺序运算。
例如执行print((5+6)*8-2),输出结果为86。
设计程序时,可以使用下列函数强制转换数据类型。
(1)int():将括号内的内容转换为整型,例如执行print(int (123.45)+2),输出结果是125而不是125.45。
(2)float():将括号内的内容转换为浮点型,例如执行print(float (100)),输出结果是100.0而不是100。
(3)str():将括号内的内容转换为字符串,例如执行print(str (123)+str(456)),输出结果是字符串"123456"而不是579,此时“+”起到连接两个字符串的作用。
字符串和数值的区别如下。
字符串必须用双引号或单引号括起来,例如'abcde'、"12345"等。这类似于我们在书面语言表达中,某人说的话要用双引号括起来。显然,某人说的话可以是中文,可以是英文,可以是数字,可以是各种符号,不需要做任何修改,原封不动地复述出来就好。
数值是不能用双引号和单引号括起来的。所以"12345"和12345是不同类型的数据,Python处理它们的方式也是不一样的。诸如123+456这样的表达,在现实生活中的理解就是数学老师在黑板上写的一个数学表达式,你必须要计算出结果。
了解了以上的知识后,我们使用Visual Python设计一个简单计算器,用来进行复杂的算术运算。
打开Visual Python,设置窗体名称为“简单计算器”,选中控件、控件和控件绘制界面,如图2.2所示。
◎图2.2
窗体和这些绘制在窗体设计区内的控件都被看作对象(object)。
对象的概念放在现实生活中可以这么理解:我是一个对象,我的计算机是一个对象,面前的桌子是一个对象,家里养的小狗也是一个对象……换言之,目之所及的事物均为对象。
在Python中“万物皆对象”,所以,绘制的输入框、文本框、按钮等均为对象。
Python是面向对象的编程语言,它符合我们的思维习惯,具有很强的灵活性和可扩展性,开发效率很高。
绘制好所有的控件后,我们需要在Visual Python工作界面右侧的控件属性设置面板中设置某些控件的属性,如图2.3所示。使用控件属性设置面板的前提是已选中窗体设计区中的某个控件,否则控件属性设置面板的状态为灰色,表示不可用。
◎图2.3
属性(attribute)用来描述某个对象的特征,例如小狗是一个对象,它的名字、颜色、大小、年龄、体重等都是它的属性。
对于绘制在窗体设计区的控件来说,它的名称、位置、大小、颜色等是它的属性,可以通过设置它的属性值改变其特征。
不同的控件有不同的属性,但也有一些共有属性,例如每个控件都有一个“控件ID号”属性,而控件箱中的横滚条和纵滚条的“长度”属性是独有的(其他控件对应的属性是“宽度”和“高度”属性)。
如图2.4所示,选中左边第一个按钮(Button1)后,输入“文本”属性的值“清空”后,按Enter键或者单击“OK”按钮确定。同理,设置第二个按钮(Button2)的“文本”属性为“计算”。
◎图2.4
若希望单击“清空”按钮时,文本框的内容能被清空,单击“计算”按钮时,能计算输入框内数学表达式的值并将结果显示在文本框内,就要用到Python的事件驱动机制。
事件驱动(event driven)放在现实生活中可以这么理解:我对小狗这个对象扔了一个肉包子,扔肉包子的行为就是一个事件,这个事件引起了小狗的反应,驱动小狗对我摇尾巴这样的行为发生。
对于Python来说,就是在控件上发生了一个事件(例如单击该控件、从键盘输入字符到该控件上、鼠标指针移到该控件上等),引起了控件的反应,并为此执行了一段相应的代码。
在Visual Python中,为控件添加事件驱动代码很方便,只需选中相应控件,然后在Visual Python工作界面右下方的控件事件设置面板中单击事件对应的按钮即可。对于窗体设计区内的两个按钮来说,因为需要添加的是单击鼠标左键事件,所以单击“单击鼠标左键事件”标签右边的按钮即可,如图2.5所示。
◎图2.5
为两个按钮分别添加了单击鼠标左键事件后,单击按钮保存文件。下面我们将在打开的IDLE++中编写代码。
可以看到在IDLE++中显示的代码里,已经添加了Button1和Button2的单击鼠标左键事件的函数。
def Button1_Mouse_Press_1(event): # Button1的鼠标左键按下事件函数
print("Button1 的鼠标左键按下了 事件发生")
def Button2_Mouse_Press_1(event): # Button2的鼠标左键按下事件函数
print("Button2 的鼠标左键按下了 事件发生")
单击按钮运行程序,尝试分别单击、按钮,如果能在控制台窗口中输出相应的字符串,则说明两个按钮的事件驱动代码是可以正常运行的,如图2.6所示。稍后只需要将输出语句替换为我们自己写的代码即可。
◎图2.6
要实现的代码逻辑关系如图2.7所示。
◎图2.7
替换后的代码如下(如果有Init()函数的动画示例代码,将其全部删除)。
def Button1_Mouse_Press_1(event): # “清空”按钮的单击事件
Text1.delete('1.0','end')
def Button2_Mouse_Press_1(event): # “计算”按钮的单击事件
Text1.insert('end',str(Entry1.get())+'='+str(eval(Entry1.get()))+'\n')
Entry1.delete(0,'end')
Text1.delete('1.0','end')表示将文本框Text1里显示的内容全部删除。
Entry1.delete(0, 'end')表示将输入框Entry1里显示的内容全部删除。
Text1.insert('end',str(Entry1.get())+'='+str(eval(Entry1.get()))+'\n')表示在文本框Text1的末尾处插入str(Entry1.get())+'=' +str(eval(Entry1.get()))+'\n'字符串,其中Entry1.get()用于获取输入框Entry1里的数学表达式,eval()将括号内的字符串当成有效的表达式来求值并返回计算结果。
字符'\n'表示换行输出。
举例来说,小狗除了名字、颜色、大小、年龄、体重等属性外,它还有一些行为,例如,它会汪汪叫,它会摇尾巴,它会作揖……
在Python里,这些行为称作方法(method)。
对于控件来说,如Text1,它有什么方法呢?显然,delete()和insert()都是它的方法。
于是可以得出一个结论:对象=属性+方法。
代码替换完毕后单击按钮保存,再单击按钮运行。
在输入框中输入一个四则运算数学表达式,如图2.8所示。注意,输入的字符均为半角。
◎图2.8
单击“计算”按钮,表达式的计算结果将显示在文本框内,同时输入框的内容被清空,便于下一个数学表达式的输入,如图2.9所示。
◎图2.9
【实践1】使用简单计算器计算以下数学表达式的值。
(1)(1234+2)-3*4/5%100
(2)123**123
(3)(((((1+2)*3+4)*5+6)*7+8)*9+10)+11
【实践2】将Text1.insert('end',str(Entry1.get())+'='+str(eval(Entry1.get()))+'\n')中的“end”替换为“1.0”,即Text1.insert('1.0',str(Entry1.get())+'='+str(eval(Entry1.get()))+'\n'),替换后运行程序并观察运行结果,试回答'end'和'1.0'的作用是什么。
【实践3】试考虑要实现在Text1中每输出一行计算结果后空一行,代码应该怎么修改。
之前完成的简单计算器使用起来有些不方便,因为在输入框中输入数学表达式后,必须单击“计算”按钮才开始计算。更便捷的操作是在输入框中输入数学表达式后,按下Enter键即输出计算结果。这显然需要给某个控件再添加一个事件驱动,应该给哪个控件添加事件驱动?添加的应该是什么事件驱动?事件驱动添加后的代码应该怎么写?
(提示:在Visual Python中,为控件添加新的事件驱动后,单击按钮,重新生成的文件名如果和原文件名相同,会在原文件的代码基础上添加新增的代码。)
执行简单的Python代码,也可以在IDLE++的控制台窗口(Shell)里进行数学表达式的运算,方法是单击IDLE++中的快捷按钮,打开控制台窗口,如图2.10所示。
◎图2.10
从图中可以看到,控制台窗口里显示了一些参考信息,最后一行出现了提示符“>>>”,它的含义是Python已经准备好了,可以输入Python语句。
输入100//3后按Enter键,控制台窗口会输出该表达式的结果33,如图2.11所示。
◎图2.11
输入print(100*1000)后的运行结果如图2.12所示。
◎图2.12
试输入print("100*1000")并执行,思考输出结果为什么和执行print(100*1000)的输出结果不一样。
执行print("2的16次方为"+2**16)语句会报错,而执行print("2的16次方为"+str(2**16))语句的输出结果是正确的,请思考为什么。
试用自己的理解回答对象、属性、方法和事件驱动的含义。
微信扫码关注【异步社区】微信公众号,回复“e58443”获取本书配套资源以及异步社区15天VIP会员卡,近千本电子书免费畅读。