到今天,是正式实习一个月,并且接触python一个月整,本着坑了我一人造福全人类的宗旨,对学习内容做个整理和总结。
先介绍一下学习python前的背景,给各位希望接触编程可苦于没有基础的读者一点信心。本人目前是机械工程专业(偏力学)的在读研究僧,在这之前对编程,尤其是python这种面向对象的编程认识几乎为零,对编程的唯一印象是大一学了C语言,学了什么并不记得了,然后计算机二级C语言考了两次,一次59,一次61。之后除了因为一些项目,用matlab写过一些计算程序,看过C++的代码,到目前为止就再没接触编程,甚至还有点排斥编程,更别说做个小软件。
那么为什么开始学Python呢,由于学校要求暑期实习,所以目前在一家汽车企业的自动驾驶部门工作,导师安排用python对数据库以及仿真软件做一些处理,本来内心是懵逼的,可是想到可以学习Python这个一早就听说很牛逼和很热门的编程语言(Python已占据最热门编程语言排行榜第一位),便欣然接受了。而且对于一个工程人员,编程技能应该也是今后学习工作必不可少的。
入门篇
首先是开发环境的选择,我刚开始用的是Python自带的IDLE,后来看了自己电脑里还有spyder(当初是下的Visual Studio 2017,自动帮我安装和配置了python以及anaconda环境,所以笔者在安装这里跳过了不少坑,比如环境变量的配置等等),问了同学,查了资料才知道,这也是一个Python的IDE,然后自动安装了不少第三方库,用起来比较方便,而且它有特点我觉得比较好,可以看到程序运行中的变量,有点像MATLAB里的变量工作区窗口,也为debug提供便利。
当然了还有一个开发环境,广大乎友强烈推荐的是pycharm,说是适合新手用,当然除了这些以外还有很多其他的开发环境,读者可以根据自己喜爱自行选用。对于我这种轻度的菜鸟使用者来说,实在体会不到开发环境不同带来编程中的差别。
版本问题,笔者用的是3.6,2.7和3.X之间部分语句的语法有差异,现在最新版的是python3.7,看了一下增加了一些新的功能。
本来不打算买书的,直接上手做项目,转念一想,既然要学,还是买本书,从基本的看起,打打基础。看了一些网上的介绍,买的是这本书,书是翻译了外国人写的,整体结构不错,重要的知识点都讲到,并且书的第二部分有三个实战项目,每个项目侧重点不同,可以用到不同的第三方库。
虽然上面说到笔者对编程几乎是零基础,但是对于编程语言还是有个最基本的了解,比如一些数据结构,整形,浮点型等,还有循环,判断什么的。所以对于上面这本书,笔者先是把书第一部分,基础知识点(重点是字典列表等新的数据形式,for语句,类,程序重构,try语句)大概花了两天时间看完,并且看的过程已经开始写项目的部分程序,当然在写第一个功能的过程中也参考了网上关于数据库操作和Pandas库的一些内容。
然后根据自己的摸索,实现第一个功能(操作数据库mysql,并将数据库中多个表格的数据进行排列组合并返回数据库)大概花了一周多的时间。
从第二周周中,开始敲这本书的第二部分的实战部分,根据自己未来的需求,先敲了第二个项目关于数据处理方面的,以便不断改进自己的程序,了解了matplotlib,pandas,.csv库和random类的一些基础内容,敲了两天左右。
再纠结几天之后决定第二个项目敲编游戏的项目,接触了pygame库,一个智障游戏敲了将近一个星期还没敲完,完工前是这样的。
本书的第三个项目是关于WEB开发的,不太感兴趣,没有深究,只是看了一些爬虫的内容,因为决定以后做数据处理的话,获取数据是必须的,所以网络爬虫应该还算有用,不过这个部分没有敲什么代码。
之后在优化程序的过程中,发现之前基础部分看的内容有些忘了,归结原因可能是第一遍看的时候没有跟着书上敲代码,于是又把基础知识看了一遍,并且把书上的代码也敲了一遍。
之后就是不断的对程序优化,并按照实际需求对功能进行增加和更改,学习的过程中总是觉得网上讲的东西不够系统,于是又买了两本关于科学计算的书。
这些书是真的贵,因为笔者喜欢翻书,写写画画在书上,就割肉买了。
两本都是很不错的工具书,需要用的时候会查,两本书的侧重不太一样。
第一本书侧重数据处理,数据分析和数据挖掘。主要介绍了python的一些高级语法,比如装饰器,迭代器,匿名函数等,另一大部分就是在机器学习方面介绍的较多,介绍了一些常用算法随机森林,K-mean之类的,笔者还在学习中。
第二本书讲解了numpy,matplotlib, scipy, pandas, OpenCV等程序库。笔者根据自己的需求都每部分都看了一些。
需要注意的是这两本书的代码都是在Python2.7里敲的,所以和3.X略有差异。
就这样大概过了四周时间,期间把项目的第一个需求写了前后将近3个版本的程序出来,因为功能比较直接和简单。所以这部分代码都是按照面向对象的编程思想开发的,也慢慢理解了对象式编程的思想。期间还看了一些机器学习,深度学习还是有图像识别的东西,越发感觉到Python的牛逼之处。
项目第二版敲完是这样晒的:
全命令行窗口,虽然也做了一些交互,而且用Pyinstaller封装成了一个可执行文件.exe,但是不得不说,这玩意看了,没人有想用的欲望。。。
于是开始了,漫漫GUI设计学习。首先要确定用什么库去开发,手头的工具书里介绍了TraitsUI,在看完了第一部分的代码之后便头皮发麻,这玩意好像要事先创建好一个界面类,然后继承它进行二次开发,像我这种脑子直,并且对对象式编程不熟悉的人来说不太合适。当然如果读者熟练掌握面向对象的编程可以尝试,感觉这个库开发周期很短。
再查了一些其他的资料之后,决定使用Python自己的UI设计库Tkinter。这部分的学习就没有买书了,因为真的没钱了!!!
刚开始看其他人写的代码也是头皮发麻,根本不知道在写什么,后来索性不看别人写的了,自己直接上手尝试,边做边学,大概在敲了一些代码后有了感觉,也幸好这个库对面向过程式也比较友好,所以就开始按照自己的逻辑一步步设计界面,刚开始设计出来的是这样的
开发GUI期间除了在CSDN和知乎百度上看了一些资料,还下了两本PDF《辛星Tkinter教程》《Python+GUI+Programming+Cookbook》,两本书在简单界面的设计部分介绍了比较浅显易懂,不过复杂布局加上多个事件关联的讲解就不多了,但是这里头感觉坑还不少,加上网上的教程,因为各种原因,答案参差不齐,让笔者在学习的过程中在坑里越馅越深,所以决定根据自己开发过程中遇到的问题写一个掉坑分享。
Tkinter掉坑分享
1. 导入库1。网上都是:from tkinter import *,不知道是什么东西,总之我是没法用这个导入,导入了后面也不能调用它的方法,所以我的是这样:
import tkinter as tk,记住后面所有调用tk的方法加上tk前缀如:tk.END
2. 导入库2。由于界面需要下拉列表和滑轮文本框,这两个组件在tkinter本身的库中是没有的,需要用到扩展库ttk和方法scrolledtext,所以:
from tkinter import ttk, from tkinter import scrolledtext
3. scrolledtext这是在类ScrolledText,我看了它的源代码,其实就是将tkinter原本的scrollbar滚动条和text文本框和到了一起,但是目前只有上下滑动,笔者还希望左右滑动文本,所以在第二版中就放弃了这个类,自己写了一个组合方法。(其实网上也有,代码可以咨询笔者本人)。感兴趣的同学也可以自己更改官方的.py文件,源码不是很长。
4. Entry(既输入文本框)的问题,笔者想实现,返回下拉列表里选择的值取int后传参给一个函数,这个功能每次运行都会崩溃,连程序都运行不了,错误提示是,函数没有取到任何列表中的值。按照网上的方法,增加全局变量,设定事件关联等都没有用。
后来想到因为程序运行前,还没有给entry输入任何值,当然函数收不到实参,程序也就无法运行,于是用set()方法给entry先赋了一个初值,完美解决!
5.关于GUI窗口的布局,Tkinter有三种布局方式,pack(),grid(),place()三种布局具体的使用方式,读者可以自己查阅资料。其中place方式是最不常用的,因为每台显示器的分辨率不同,所以对于坐标位置的布局形式也会改变。
笔者在布局过程中主要使用grid()。另外说明一点就是官方说法:pack()布局和grid()布局不能同时使用。可是这两种布局都是各有优缺点,同时使用大大提高了布局的效率,在这里给出一个解决办法。
首先,我想可能是自己对官方说法一开始有个误解,不能同时用指的是不能同时在一个作用域里用(作用域的概念,很重要,自行百度)。于是我们可以通过创建不同函数,把不同的布局方法封装在函数中,在布局时调用函数就可以了。
所以我的布局形式是以grid()方法为主,在滚条布局或者标题布局中利用定义函数来调用pack()方法,方便又好用。
6. 布局2。关于界面布局,frame和LabelFrame,我认为是很好用的构图组件,这两个组件都是给你的界面分块的,笔者刚开始的第一版UI就是没有搭框架,所以像一坨X,后来先用框架构思了一下整体布局,是这样的。
7. GUI界面添加图标。这有一条固定语句,网上也可以找的,这里我要说的是当你希望用Pyinstaller把你的.py文件打包成exe时,就会出问题,网上的解决方法大概有两种,一种是添加图标.ico文件的路径到Pyinstaller中,这个地方要写一堆的代码,故不推荐。第二种就是用python先将你的.ico文件转化.py文件的base64数据后再添加,完整操作方法的链接在下面。
其实还有一种方法,其实你也不用在主程序的.py文件中添加图标文件,而是直接生成exe文件创建一个快捷方式,给快捷方式添加图标就好了,你还可以把这个快捷放式放到桌面上,方便打开,这个方式专治各种疑难,百试不爽。
笔者给小程序添加的图标是这样的:
最后给各位看一下做出的最终GUI效果,它的主要功能就是用户输入一定参数,软件根据参数和限定条件,计算出符合的数据记录并且保存至.csv文件中。总体来说我还是满意的,最满意的部分是文本框左右滑动以及小弹窗。
这样的界面,代码量不到300行(不包括事件的关联的数据处理函数)
由于底层代码直接用的之前写好的,大概花了三天时间写完了这样一个小软件。总体来说Tkinter开发GUI的过程还是愉快的,主要是开发效率比较高。
至此一个月的Python学习就分享完了,欢迎大家吐槽,讨论和学习。
领取专属 10元无门槛券
私享最新 技术干货