Tkinter中的GUI老是有一个root窗口,无论你是主动或者别动得到.主窗口就是你的程序开始运行的时候建立的,在主窗口中你一般是放置了你主要的部件.另外,Tkinter脚本能够依据须要建立不少独立的窗口,主要的方法就是经过建立Toplevel对象。
每个Toplevel对象都建立一个显示的窗口,不须要经过mainloop方法调用。python
一个Toplevel象一个Frame,而且能够经过额外的方法来让你处理Toplevel窗口的属性。
而Tk更像一个Toplevel,可是它用于描绘程序主窗口的外貌。算法
一,Tkinter介绍 Tkinter是一个python模块,是一个调用Tcl/Tk的接口,它是一个跨平台的脚本图形界面接口。Tkinter不是惟一的python图形编 程接口,可是是其中比较流行的一个。最大的特色是跨
Tkinter 是一个python模块,是一个调用Tcl/Tk的接口,它是一个跨平台的脚本图形界面接口。Tkinter不是惟一的python图形编程接口,可是是 其中比较流行的一个。最大的特色是跨平台,缺点是性能不太好,执行速度慢。ide
一 般使用Tkinter的方法是:函数
或 者: import Tkinter 二者的区别咱们前面讲模块的时候已经说过了。布局
先 看一下GUI程序的开发,熟悉MFC的朋友应该不会陌生。在GUI程序中,咱们会有一个顶层窗口,在这个顶层窗口上能够包括全部的小窗口对象,像标签,按 钮,列表框等等,也就是说顶层窗口时咱们放置其余窗口或者控件的地方。咱们用下面的语句能够建立一个顶层窗口,或者叫根窗口:性能
Python的解释器很多,但使用最广泛的还是CPython。如果要和Java或.Net平台交互,最好的办法不是用Jython或IronPython,而是通过网络调用来交互,确保各程序之间的独立性。
中文解释(装X必备):
Python 3.0于2008年发布。2.x版本中的最后一版2.7发布于2010年中,其中包含了python生命周期及其扩展的支持声明。 2.x分支将没有看到新的主要版本。 3.x正在积极开发中,已经有五年以上的稳定版本,包括2012年的3.3版本,2014年的3.4和2015年的3.5版本。这意味着所有最近的标准库改进默认在Python
Guido van Rossum(Python语言的原创者)决定适当地清理Python 2.x,考虑其向后兼容性,而不是在2.x范围内的出新版本。最大的改进是更好的支持Unicode(所有文本字符串默认为Unicode)以及saner字节/ Unicode分离。
此外,核心语言的几个方面(例如print和exec是语句,使用floor division的整数)已经被调整为让新手学习起来更容易,并且与其余的语言更一致,并且旧的cruft已经被移除(例如,所有类现在都是新式的,“range()”返回一个内存高效的迭代,而不是如2.x中的列表)。
从此不再为讨厌的字符编码而烦恼,还可以这样玩: (A,*REST,B)=RANGE(5)
【右键计算机】
-
-
》【属性】
-
-
》【高级系统设置】
-
-
》【高级】
-
-
》【环境变量】
-
-
》【在第二个内容框中找到
变量名为Path 的一行,双击】
-
-
> 【Python安装目录追加到变值值中,用 ; 分割】
windows下用IDE打开一个新窗口如图:
变量:存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个空间。基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。因此,变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符。
Python 中的变量赋值不需要类型声明。
每个变量在内存中创建,都包括变量的标识,名称和数据这些信息。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
等号“=”用来给变量赋值。
等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。例如:
执行以上程序会输出如下结果:
以上实例,创建一个整型对象,值为1,三个变量被分配到相同的内存空间上。
以上实例,两个整型对象1和2的分配给变量a和b,字符串对象"john"分配给变量c。
模块让你能够有逻辑地组织你的Python代码段。
把相关的代码分配到一个 模块里能让你的代码更好用,更易懂。
模块也是Python对象,具有随机的名字属性用来绑定或引用。
简单地说,模块就是一个保存了Python代码的文件。模块能定义函数,类和变量。模块里也能包含可执行的代码。
一个叫做aname的模块里的Python代码一般都能在一个叫aname.py的文件中找到。下例是个简单的模块support.py。
想使用Python源文件,只需在另一个源文件里执行import语句,语法如下:
当解释器遇到import语句,如果模块在当前的搜索路径就会被导入。
搜索路径是一个解释器会先进行搜索的所有目录的列表。如想要导入模块support.py,需要把命令放在脚本的顶端:
一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。
这个声明不会把整个fib模块导入到当前的命名空间中,它只会将fib里的fibonacci单个引入到执行这个声明的模块的全局符号表。
把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:from modname import *
这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。
当你导入一个模块,Python解析器对模块位置的搜索顺序是:
模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
作为环境变量,PYTHONPATH由装在一个列表里的许多目录组成。PYTHONPATH的语法和shell变量PATH的一样。
变量是拥有匹配对象的名字(标识符)。命名空间是一个包含了变量名称们(键)和它们各自相应的对象们(值)的字典。
一个Python表达式可以访问局部命名空间和全局命名空间里的变量。如果一个局部变量和一个全局变量重名,则局部变量会覆盖全局变量。
每个函数都有自己的命名空间。类的方法的作用域规则和通常函数的一样。
Python会智能地猜测一个变量是局部的还是全局的,它假设任何在函数内赋值的变量都是局部的。
因此,如果要给全局变量在一个函数里赋值,必须使用global语句。
global VarName的表达式会告诉Python, VarName是一个全局变量,这样Python就不会在局部命名空间里寻找这个变量了。
例如,我们在全局命名空间里定义一个变量money。我们再在函数内给变量money赋值,然后Python会假定money是一个局部变量。然而,我们并没有在访问前声明一个局部变量money,结果就是会出现一个UnboundLocalError的错误。取消global语句的注释就能解决这个问题。
dir()函数一个排好序的字符串列表,内容是一个模块里定义过的名字。
返回的列表容纳了在一个模块里定义的所有模块,变量和函数。如下一个简单的实例:
在这里,特殊字符串变量__name__指向模块的名字,__file__指向该模块的导入文件名。
根据调用地方的不同,globals()和locals()函数可被用来返回全局和局部命名空间里的名字。
如果在函数内部调用locals(),返回的是所有能在该函数里访问的命名。
如果在函数内部调用globals(),返回的是所有在该函数里能访问的全局名字。
两个函数的返回类型都是字典。所以名字们能用keys()函数摘取。
当一个模块被导入到一个脚本,模块顶层部分的代码只会被执行一次。
因此,如果你想重新执行模块里顶层部分的代码,可以用reload()函数。该函数会重新导入之前导入过的模块。语法如下:
在这里,module_name要直接放模块的名字,而不是一个字符串形式。比如想重载hello模块,如下:
包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的Python的应用环境。
考虑一个在Phone目录下的pots.py文件。这个文件有如下源代码:
同样地,我们有另外两个保存了不同函数的文件:
当你导入Phone时,为了能够使用所有函数,你需要在__init__.py里使用显式的导入语句,如下:
当你把这些代码添加到__init__.py之后,导入Phone包的时候这些类就全都是可用的了。
如上,为了举例,我们只在每个文件里放置了一个函数,但其实你可以放置许多函数。你也可以在这些文件里定义Python的类,然后为这些类建一个包。
很多人说,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存在。如果是解释型语言,那么生成的*.pyc文件是什么呢?c应该是compiled(编译)的缩写才对啊!
为了防止其他学习Python的人也被这句话误解,那么我们就在文中来澄清下这个问题,并且把一些基础概念给理清。
9.2 解释型语言和编译型语言 ?
计算机是不能够识别高级语言的,所以当我们运行一个高级语言程序的时候,就需要一个“翻译机”来从事把高级语言转变成计算机能读懂的机器语言的过程。
这个过程分成两类,第一种是编译,第二种是解释。
编译型语言在程序执行之前,先会通过编译系统对程序执行一个“预处理、编译、汇编、链接”的过程,把程序转变成机器语言。运行时就不需要翻译,而直接执行就可以了。最典型的例子就是C语言。
解释型语言就没有这个编译的过程,而是在程序运行的时候,通过解释器对程序逐行作出解释,然后直接运行,最典型的例子是Ruby。
通过以上的例子,我们可以来总结一下解释型语言和编译型语言的优缺点,因为编译型语言在程序运行之前就已经对程序做出了“翻译”,所以在运行时就少掉了“翻译”的过程,所以效率比较高。但是我们也不能一概而论,一些解释型语言也可以通过解释器的优化来在对程序做出翻译时对整个程序做出优化,从而在效率上超过编译型语言。
此外,随着Java等基于虚拟机的语言的兴起,我们又不能把语言纯粹地分成解释型和编译型这两种。
用Java来举例,Java首先是通过编译系统编译成字节码文件,然后在运行时通过解释器给解释成机器文件。所以我们说Java是一种先编译后解释的语言。
其实Python和Java/C#一样,也是一门基于虚拟机的语言,我们先来从表面上简单地了解一下Python程序的运行过程吧。
当我们在命令行中输入python hello.py时,其实是激活了Python的“解释器”,告诉“解释器”:你要开始工作了。可是在“解释”之前,其实执行的第一项工作和Java一样,是编译。
熟悉Java的同学可以想一下我们在命令行中如何执行一个Java的程序:
只是我们在用Eclipse之类的IDE时,将这两部给融合成了一部而已。其实Python也一样,当我们执行python hello.py时,他也一样执行了这么一个过程,所以我们应该这样来描述Python,Python是一门先编译后解释的语言。
在说这个问题之前,我们先来说两个概念,PyCodeObject和.pyc文件。
我们在硬盘上看到的pyc自然不必多说,而其实PyCodeObject则是Python编译器真正编译成的结果。我们先简单知道就可以了,继续向下看。
当python程序运行时,编译的结果则是保存在位于内存中的PyCodeObject中,当Python程序运行结束时,Python解释器则将PyCodeObject写回到pyc文件中。
当python程序第二次运行时,首先程序会在硬盘中寻找pyc文件,如果找到,则直接载入,否则就重复上面的过程。
所以我们应该这样来定位PyCodeObject和pyc文件,我们说pyc文件其实是PyCodeObject的一种持久化保存方式。
Python Number 数据类型用于存储数值。数据类型是不允许改变的,这就意味着如果改变 Number 数据类型的值,将重新分配内存空间。
以下实例在变量赋值时 Number 对象将被创建:
您也可以使用del语句删除一些 Number 对象引用。
您可以通过使用del语句删除单个或多个对象,例如:
Python 支持四种不同的数值类型:
返回给定参数的最大值,参数可以为序列。 |
返回给定参数的最小值,参数可以为序列。 |
返回x的整数部分与小数部分,两部分的数值符号与x相同,整数部分以浮点型表示。 |
x**y 运算后的值。 |
返回浮点数x的四舍五入值,如给出n值,则代表舍入到小数点后的位数。 |
返回数字x的平方根,数字可以为负数,返回类型为实数,如math.sqrt(4)返回 2+0j |
随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性。
Python包含以下常用随机数函数:
从序列的元素中随机挑选一个元素,比如random.choice(range(10)),从0到9中随机挑选一个整数。 |
从指定范围内,按指定基数递增的集合中获取一个随机数,基数缺省值为1 |
随机生成下一个实数,它在[0,1)范围内。 |
改变随机数生成器的种子seed。如果你不了解其原理,你不必特别去设定seed,Python会帮你选择seed。 |
将序列的所有元素随机排序 |
随机生成下一个实数,它在[x,y]范围内。 |
Python包括以下三角函数:
返回x的反余弦弧度值。 |
返回x的反正弦弧度值。 |
返回x的反正切弧度值。 |
返回给定的 X 及 Y 坐标值的反正切值。 |
返回x的弧度的余弦值。 |
返回的x弧度的正弦值。 |
数学常量 pi(圆周率,一般以π来表示) |
数学常量 e,e即自然常数(自然常数)。 |
Python语言支持以下类型的运算符:
接下来让我们一个个来学习Python的运算符。
以下假设变量a为10,变量b为20:
减 - 得到负数或是一个数减去另一个数 |
乘 - 两个数相乘或是返回一个被重复若干次的字符串 |
取模 - 返回除法的余数 |
幂 - 返回x的y次幂 |
取整除 - 返回商的整数部分 |
以下实例演示了Python所有算术运算符的操作:
以下假设变量a为10,变量b为20:
等于 - 比较对象是否相等 |
不等于 - 比较两个对象是否不相等 |
不等于 - 比较两个对象是否不相等 |
大于 - 返回x是否大于y |
小于 - 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。注意,这些变量名的大写。 |
大于等于 - 返回x是否大于等于y。 |
小于等于 - 返回x是否小于等于y。 |
以下实例演示了Python所有比较运算符的操作:
以下假设变量a为10,变量b为20:
以下实例演示了Python所有赋值运算符的操作:
按位运算符是把数字看作二进制来进行计算的。Python中的按位运算法则如下:
按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 | |
按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。 | |
按位异或运算符:当两对应的二进位相异时,结果为1 | |
按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 | (~a ) 输出结果 -61 ,二进制解释: , 在一个有符号二进制数的补码形式。 |
左移动运算符:运算数的各二进位全部左移若干位,由" | |
右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数 |
以下实例演示了Python所有位运算符的操作:
布尔"或" - 如果 x 是非 0,它返回 x 的值,否则它返回 y 的计算值。 |
除了以上的一些运算符之外,Python还支持成员运算符,测试实例中包含了一系列的成员,包括字符串,列表或元组。
如果在指定的序列中找到值返回 True,否则返回 False。 |
如果在指定的序列中没有找到值返回 True,否则返回 False。 |
以下实例演示了Python所有成员运算符的操作:
身份运算符用于比较两个对象的存储单元
is是判断两个标识符是不是引用自一个对象 |
is not是判断两个标识符是不是引用自不同对象 |
以下实例演示了Python所有身份运算符的操作:
以下表格列出了从最高到最低优先级的所有运算符:
按位翻转, 一元加号和减号 (最后两个的方法名为 +@ 和 -@) |
以下实例演示了Python所有运算符优先级的操作:
Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。
可以通过下图来简单了解条件语句的执行过程:
Python 编程中 if 语句用于控制程序的执行,基本形式为:
其中"判断条件"成立时(非零),则执行后面的语句,而执行内容可以多行,以缩进来区分表示同一范围。
else 为可选语句,当需要在条件不成立时执行内容则可以执行相关语句,具体例子如下:
if 语句的判断条件可以用>(大于)、=(大于等于)、
当判断条件为多个值时,可以使用以下形式:
由于 python 并不支持 switch 语句,所以多个条件判断,只能用 elif 来实现,如果判断需要多个条件需同时判断时,可以使用 or (或),表示两个条件有一个成立时判断条件成功;使用 and (与)时,表示只有两个条件同时成立的情况下,判断条件才成功。
# 例3:if语句多个条件
当if有多个条件时可使用括号来区分判断的先后顺序,括号中的判断优先执行,此外 and 和 or 的优先级低于>(大于)、
你也可以在同一行的位置上使用if条件判断语句,如下实例:
以上代码执行输出结果如下:
Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串。
for循环的语法格式如下:
另外一种执行循环的遍历方式是通过索引,如下实例:
以上实例我们使用了内置函数 len() 和 range(),函数 len() 返回列表的长度,即元素的个数。 range返回一个序列的数。
在 python 中,for … else 表示这样的意思,for 中的语句和普通的没有区别,else 中的语句会在循环正常执行完(即 for 不是通过 break 跳出而中断的)的情况下执行,while … else 也是一样。
break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句。
如果您使用嵌套循环,break语句将停止执行最深层的循环,并开始执行下一行代码。
continue 语句用来告诉Python跳过当前循环的剩余语句,然后继续进行下一轮循环。
Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。其基本形式为:
执行语句可以是单个语句或语句块。判断条件可以是任何表达式,任何非零、或非空(null)的值均为true。
当判断条件假false时,循环结束。
以上代码执行输出结果:
while 语句时还有另外两个重要的命令 continue,break 来跳过循环,continue 用于跳过该次循环,break 则是用于退出循环.
此外"判断条件"还可以是个常值,表示循环必定成立,具体用法如下:
如果条件判断语句永远为 true,循环将会无限的执行下去,如下实例:
注意:以上的无限循环你可以使用 CTRL+C 来中断循环。
在 python 中,for … else 表示这样的意思,for 中的语句和普通的没有区别,else 中的语句会在循环正常执行完(即 for 不是通过 break 跳出而中断的)的情况下执行,while … else 也是一样。
类似if语句的语法,如果你的while循环体中只有一条语句,你可以将该语句与while写在同一行中, 如下所示:
注意:以上的无限循环你可以使用 CTRL+C 来中断循环。
python2.X解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill)
我们知道,计算机只认识0和1,那么我们要怎么表示我们的语言和信息呢?计算机最先由米国发明,如果要用01表示语言,那么只需要表示出26个大小写字母,0-9,还有标点符号、特殊字符等就可以储存各种英文数字等信息了吧?所以,他们就用规定二进制的八位来表示一个字符,这八个位可以表示2的8次方种情况,每一种规定表示那个字符,就OK了。这个规定就是assii码表了,如下图。
结果他们发现只用127中情况,就把所有的字母数字字符都表示了,根本没用完2**8=256中情况,剩下的咋办?(留给其他国家表示他们的语言)
所以,ASCII表中1个字节就可以表示所有的英文所需要的字符。127个字符完全就可以表示所有英文中能用的的内容了。
但是ASCII到了中国之后,常用的中文都有6000多个,完全不够用啊!
怎们办?中国人非常聪明:就在原有的扩展位中,扩展出自己的gbk、gb2312、gb2318字符编码。
他是怎么扩展的呢?比如说在ASCII码中的128这个位置,这个位置又指定一张单独表,聪明吧! 其他国家也是这样设计的!
为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5。
GB年)一共收录了7445个字符,包括6763个汉字和682个其它符号。汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE。
GB2312 支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。2000年的 GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。现在的PC平 台必须支持GB18030,对嵌入式产品暂不作要求。所以手机、MP3一般只支持GB2312。
从ASCII、GB2312、GBK 到GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一 地处理。区分中文编码的方法是高字节的最高位不为0。按照程序员的称呼,GB2312、GBK到GB18030都属于双字节字符集 (DBCS)。
有的中文Windows的缺省内码还是GBK,可以通过GB18030升级包升级到GB18030。不过GB18030相对GBK增加的字符,普通人是很难用到的,通常我们还是用GBK指代中文Windows内码。
各个国家都在扩展,扩展位够不够?假设有两个国家都同时用一个扩展位,是不是会导致乱码?
基于这个乱象国际互联网组织就说你们各个国家都别搞了,我们给你们搞一个统一的,这个统一的是什么呢Unicode“万国编码”,Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。
Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,规定虽有的字符和符号最少由 16 位来表示(2个字节),即:2 **16 = 65536,注:此处说的的是最少2个字节,可能更多。
这里还有个问题:使用的字节增加了,那么造成的直接影响就是使用的空间就直接翻倍了!
举例还说:同样是ABCD这些字符存储一篇相同的文章,使用ASCII码如果是1M的话,那么Unicode存储至少2M可能还会更多。
为了解决上述问题就出现了:UTF-8编码
UTF-8编码:是对Unicode编码的压缩和优化,他不再使用至少使用2个字节,而是将所有的字符和符号进行分类:
ascii码中的内容用1个字节保存;
欧洲的字符用2个字节保存;
东亚的字符用3个字节保存...
图形用户界面 GUI是图形用户界面的缩写,Python默认的GUI开发模块是tkinter,是基于Tk的,Tk是一个工具包,提供了跨平台的GUI控件。但Tk并不是最新最好的选择,也没有功能特别强大的GUI控件,事实上,开发GUI应用并不是Python最擅长的工作,如果真的需要使用Python开发GUI应用,wxPython、PyQt、PyGTK等模块都是不错的选择。 基本上使用tkinter来开发GUI应用需要5个步骤: 导入tkinter模块中我们需要的; 创建一个顶层窗口对象并用它来承载整个GUI应用; 在顶层窗口对象上添加GUI组件; 通过代码将这些GUI组件的功能组织起来;