# 1 教程
[全民一起玩 python](https://www.bilibili.com/video/av85391396?p=4)
## 语法特点
* 不用声明变量
* if 后要加: 冒号
* **同一层级的代码要对齐**,如果有缩进则会认为是被包含关系的下一层级的代码
* 不要用 python 读取 word 文件,因为 word 中有各种各样的格式,读取有误
* print()里面内容用逗号, 连接,input里面内容用加号+连接。
* 自定义 函数:vba中自定义函数(如function ccc())如果有返回值,只需要写 ccc = xxx即可。
* python中,自定义函数与c#一样要写一个return xxx。
* 幂运算 用两个“/*/*” 表示 ‘2**3 = 8’
* 正数整除用“//”表示

## 快捷键
https://www.cnblogs.com/liyuanhong/articles/4375890.html
加缩进:可以直接选中按tab
批量注释:alt +3
去注释:alt +4

## 帮助文档
https://docs.python.org/zh-cn
## 全民一起玩python教程资料
[https://www.ukoedu.com/pythoncourseinfo](https://www.ukoedu.com/pythoncourseinfo)

## bilibili 免费课程

[https://www.bilibili.com/video/av31294714?from=search&seid=14926404958243477782](https://www.bilibili.com/video/av31294714?from=search&seid=14926404958243477782)
pyp 中文网里面也有很多相关的视频

官网:www.python.org,可以直接下载。也可以用 visual studio 编辑器编辑。但要注意重新安装一下 python 模块(重启visuan studio 安装程序,选择“修改”即可)。
## 学习网站
[知乎问答](https://www.zhihu.com/question/36082950)
[某博客中推荐的内容](https://www.cnblogs.com/guohongwei/p/10840963.html)
[廖雪峰的官方网站](https://www.liaoxuefeng.com/wiki/897692888725344/897692941155968)
[runoob 网站(推荐)](https://www.runoob.com/python/python-tutorial.html)
## 环境设置:添加行号
[https://www.jianshu.com/p/dd1dc070367f](https://www.jianshu.com/p/dd1dc070367f)
[https://blog.csdn.net/huidr0/article/details/97804411](https://blog.csdn.net/huidr0/article/details/97804411)
[http://www.pythonheidong.com/blog/article/49497/](http://www.pythonheidong.com/blog/article/49497/)
其中文本configHandle里面设置的要跟linenumber里面一致。注意几行代码的一致性,比如configHandle.py 是否在python/Lin/idlelib文件夹,如果没有,则从下载文件中复制到扩展包中。

可以先运行linenumber.py。看是否有问题,如果没问题即可。
或者:用alt+g定位错误代码行。

> 重启后,在options设置里面记得勾选!!

## 符号
不等于:'!='
# 占位符 第18讲
```
total = total +1
print('the total is:' , total) //这里用逗号隔开即可,而不是用加号
```
但是如果要连接字符串时,就要写加号。

```
name = 'abc'
age = 12
s = '我叫'+ name + '我的年龄'+ age+'岁'
print(s)
上面可以替换成:
s = '我叫%s,我%d岁了,还 没读书。' &(name,age)
```
> 记得在后面加`& (name, age)` ,不同的占位符代表的不一样。


或者用`s = f ' 我叫{name},今年{age}岁 ,没有读书 ' `。直接 f 加引号的办法,中间就可以直接用变量名+花括号。f与引号不能有空格。


# 交换变量
```
a = 3
b = 5
c = 1
a,b,c = c,a,b
print(a,b,c) #显示结果为:a,b,c = 1,3,5 注意交换,是把等号右边的值传给左边。
# 显示
```
# 2 函数
python 里面有很多的库,调用的时候要写“import”,比如数学运算是在一个叫`math`的库里面,要写`import math`调用。同时如果要显示结果必须写
```
import math
print(math.sin(3))
```

这里面 print 不能少,否则无法显示计算结果。
> 同一层级的代码必须对齐,否则默认为是下一层级
常见模块(库 ):

标准库 http://docs.python.org
## print 函数
用逗号隔开,与其他语言不同!
`print ("张三",power)`
vba 里面是用`&` -> `msgbox '张三' & power`
用单引号还是双引号都行。
## 交互式:用 input 函数
但是input 默认都是字符串,所以需要 int 或者 float函数转化成数字

也就是说,`c = int( input ('请输入汉字:') )` 这样得到的c也是一个int,不管input里面是汉字+数字,只要用户输入的格式正确就行。
## 音频文件
课程第六回
# 3 os 模块
打开文件、打开文件夹。
其中有一条 `os.system()`可以用来执行类似打开文件夹、关闭等的操作

```
import os
os.system('start …… ' ) 用斜线/。
os.system('open ') //在苹果操作系统上面要用 open
```

```
import os
os.system('start Y:/Desktop/测试.xlsx')
```

或者是反斜线也行。

## if else
```
if xxx:
elif xxx:
else:
```
## 逻辑运算 and 多条件
```
if gender =='femail' and (age<20 or age > 30):
也可以写成:'if gender == 'femail' and not 20<age<30'
```
## open
如果直接写`os.system('start Y:/Desktop/测试 .xlsx', 'r')`,则只是打开了这个文件,但后续想对文件进行操作,仍建议创建对象。
也可以弄成一个对象
`f = open('start Y:/Desktop/测试.xlsx','r') #只读方式打开`
r:只读,w:写入(原文本全部清除后再添加新内容),a:追加。
用 open 方法,但 open()执行以后,就自动创建了一个对象,我们可以用 `f = open('')` 来表示,如果不,也可以直接用`open('')`来表示,后续可直接调用`open('').readlines`等。
所以 f 就表示我们打开的这个文件窗口了。
以下例子用来统计出现次数,同8字典。
```
f = open('','r')
p = f.readlines() #如果文本中有回车换行,那么 readlines 方法就会自动识别,如果有 4 个段落,那么 p 就变成了一个有 4 个元素的列表,其中每个元素是一个字符串,用 ' ' 括起来。
i = 0
for s in p:
if '你真漂亮' is s:
i=i+1
print(i,s)
f.close()
```

## readlines
`p = f.readlines()` #如果文本中有回车换行,那么 readlines 方法就会自动识别,如果有 4 个段落,那么 p 就变成了一个有 4 个元素的列表,其中每个元素是一个字符串,用 ' ' 括起来。
比如下面这段话一共3段。
“我去吃饭了,
你叫一下他。
他没听我说。
”
那么p = f.readlines()以后就是:`f.readlines() = ['我去吃饭了,' , '你叫一下他。' , '他没听我说。' ]`
所以如果p.count('我'),也可以统计出结果。
## 读取文件保存报错
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 205: illegal multibyte sequence
因为不要用 python 读取 word!!!,word 有自己软件自带的一些 markdown 语法,与 python 不兼容!!!
[https://blog.csdn.net/lqzdreamer/article/details/76549256](https://blog.csdn.net/lqzdreamer/article/details/76549256)
可修改代码,`f = open('','r',encoding = 'gbk')` ,或者是`f = open('','r',encoding = 'utf-8)` 有的时候用gbk,有的时候用utf-8,看情况。比如字典中的自定义函数例子mytools.count就只能用gbk。
第16讲。


## 用一个新的txt文件来存放拆分的单词内容 拆分单词 分词 类似也可以用8 字典。
将一篇英语文章全部拆分成单词,放入一个新的txt文件中:
```
f = open('Y:/Desktop/world.txt','r')
p = f.readlines()
# 如果f 文章一共4段,那么p就有4个元素,每个元素对应一段
total_words = []
for s in p:
#为了得出每一段中的所有单词,再汇总
s = s.replace('.',' ')
#标点符号全部去掉,用空格代替,后续就可以只用空格进行划分了
s = s.replace(',',' ')
#标点符号全部去掉,用空格代替,后续就可以只用空格进行划分了
s = s.lower() #有的单词大小写不同会被识别成不同单词,所以要统一格式
line_words = s.split(' ')
#每一段全部拆分成一个一个单词
total_words.extend(line_words) #也可以写成total_words = total_words + line_words
,但如果是加法,则每次都会新建一个列表,效率低,而用extend方法则可以直接在原有列表中添加。
f.close()
set_words = set(total_words)
total_words = list(set_words)
total_words.sort()
#排序一下按字母表顺序排
f2 = open('Y:/Desktop/world22.txt','w')
f2.write('\n'.join(total_words)) # 用write方法将字符串写入txt文件,但由于我们之前拆分过的是列表,不是字符串,所以要用join方法再连起来,但我们更希望换行,所以可以用'\n'把这些列表连接成一个字符串,同时又有换行的功能
f2.close()
#一定要记得写close!!!!不然会发现新建了文件但打开没有内容,因为如果不写close,则默认东西还是在内存中。只有加了close以后才能看到文件内容。
```
> 用write方法将字符串写入txt文件,但由于我们之前拆分过的是列表,不是字符串,所以要用join方法再连起来,但我们更希望换行,所以可以用'\n'把这些列表连接成一个字符串,同时又有换行的功能
;
> 一定要记得写close!!!!不然会发现新建了文件但打开没有内容,因为如果不写close,则默认东西还是在内存中。只有加了close以后才能看到文件内容。
> **代码简化**!!!有一些s只是用来传递值,所以可以简写成`line_words = s.replace(',',' ').replace('.',' ').lower().split()`
> 


但还有个问题:上图中单词出现重复,我们需要的是不重复的单词。此时可以用set解决。在sort转置前加两行:
```
set_words = set(total_words) # set功能的意思是得到不重复的子集,不考虑顺序。详见“7 集合”
total_words = list( set_words) # 详见“7 集合”
```


> **简化:**



也可以用第三方插件,如jieba.py
# 4 循环 if、while、for
```
if age<18 : $$冒号不能省略!注释用$$美元符号
print('未成年')
else :
print("成年")
```

if 在 25-30之间:25<= age <=30

while 重复录入

注意有计数器的功能! 用i++ 这样的形式来计数,然后作为判断条件。
```
s = 'y' #记得要有初始值!!!!
m= 0
while s =='y'
name = input('please enter name:')
age = input('please enter age:')
m = m +1
s = input('do you want to continue?(y/n)')
print("total:", i )
```

## 死循环
ctrl+c 强制退出
但有时候为了不断输入,可以人为制造死循环。如下图
```while 1==1
x = int(input('请输入数字:'))
```

## for
for i in 列表:

语句类似于c#、vba 中的`for each`
>**但 for 循环只能读取,不能修改列表中的值,用 while 则可以修改列表中的值**

## 随机数
`import random`
random.randint(a, b) 随机生成 a b 之间的整数。

生成随机数,用来猜大小
记得 break

# 5 序列
包括列表、字符串、元组、集合等

# 6 列表,可以理解为数组 第 12讲
用方括号`[]`
> 注意取数范围!
可以用冒号表示数组中的某几个元素,但注意右边是开区间,要比下标元素大 1,也就是,如果列表里面只有 5 个元素,那么下标编号就是 0-4,如果要从下标 2 开始取数到下标 4,那么必须写成 a[2:5),而不是 a[2:4]

> 但如果不写取值范围的起始值,只写冒号后面,与上面一样,也是开区间,比下标大 1。
](images/screenshot_1582969650489.png)
## 长度
```
a[300,400,'hello',66.6,'well']
print(len(a)) #即可求出长度
print(a[0:len(a)-1]) #即可列出 a 中所有元素,这样当后续 a 进行修改时,就不用在修改 print 里面的内容了
```

## 相乘
```
a[1,2,'a']
print(a*3) # 则是把 a 里面的元素复制 3 次
```

## range(m,n) 第 12讲
比如range(3,7)
自动生成 [3,7)之间的数字,也就是[3,4,5,6],左闭右开,要记得!!!

也可以只提供 一个7

range 可指定步长,比如range(1,10,2),生[1,3,5,7,9],不需要跟其他语言一样自己 i++,因为默认每次循环,都自动跳到下一个。

## 元素可替换
```
a = [300,400,'hello',66.6,'well']
a[3]='www'
显示:a = [300,400,'hello','www','well']
```

## 添加列表元素
```
a=[1,2,3]
a+4 #报错!!!!因为加号左右两边格式不一样
a+[4] #可以,结果变为[1,2,3,4],但 a 本身还是[1,2,3]
a = a+[4] # 除非这么写才可以a=[1,2,3,4]
a.insert(2,'qqq') #从下标2开始插入qqq,qqq的下标是2,原来的数据往后移
```

**更好的办法:**
直接写a.append(4)即可。因为列表是对象,可以用属性!

第15讲,也可以用`a.exten(b)`,如果用加法,则每次都会新增一个新的列表,效率低。

## 列表是个对象,可以用各种属性!!! 第 13讲

面向对象!——属性+方法
所以上面的例子直接写`a.append(4)`即可


其他方法:
```
a.append()
a.count('NNN') #统计某个元素 NNN 出现的次数
a.insert(i,'NNN') #从下标 i 开始插入'NNN',原来下标 i 的元素变成下标 i+1
a.pop(i) #移除下标 i 的元素,不直接括号内写要移除的内容!!!!如 a.pop('NNN')则报错,而要用 remove 方法!
a.remove('NNN')
a.reverse() #倒序
a.sort() #从小到大自动排序
```


## 转置或倒序
>注:如果要显示转置倒序后的数列,要先写r.sort(),再写print(r),不能写成print(r.sort())!!!!

倒序也可以写成
a[ : : -1] #步长-1,但原来的 a 数列没有变化。
字符串也可以转置,注意不要写成s= ['spring is comming'],而是直接写s = 'spring is comming'
## 切片
列表可切片,如
`a = [300,400,'hello',66.6,'well']`
字符串也可以切片。字符串本身不能改变元素,但通过切片就可以。
```
s = '春眠不觉晓'
s[2:] #显示'不觉晓',从下标 2 开始,也就是第三个元素
s[:2] #显示'春眠',从第一个元素开始一直到下标 2(不包含下标 2)
```
所以可以利用切片的特点,往字符串中间插入或者改变字符串,但其实只是显示而已,原来的字符串还是不变,除非写成`s = s[2:]`


字符串也可以转置,注意不要写成s= ['spring is comming'],而是直接写s = 'spring is comming'


# 7 set、list集合转换成列表 列表转换成集合 集合列表转换 列表集合转换 删除重复 去除重复
在前序open类型中:
```
set_words = set(total_words)
total_words = list( set_words)
```
集合用{}表示,不允许重复,可以用多个数据类型,没有顺序,所以没有下标,如果写X[2]就会报错,因为没有下标。

但python中提供了内置函数`set(x)` 以及`list()`函数
```
y = [3,4,5,1,3,1,3,23]
x = set(y) #第一次转换:用set来得到一个不重复的集合,没有顺序,没有下标
得出:x = {3,4,5,1,23} #注意是用花括号{}
y = list(x) #第二次转换:用list将y转换成列表
得出:y = [3,4,5,1,23] #注意是用[]
```
# 8 字典 第16讲
集合、嵌套等。键值对。写法:
`names = {'张三':24, '李四':25, '王五': '三好生' } # 注意不能写成 '张三 : 24' `
无下标,无顺序,所以如果写`name[2]`,则会出错。
## 查询
`names['张三']` 就会显示24。
键不能重复。如果有多个,那么默认以最后出现的键值对为准。
## 修改
值可以修改,**但键不允许修改**。
`names['张三'] = 30`,即可。
如果要修改键,则只能先把原来的键值对全部删除,然后再新增。
## 删除 再新增
```
names.pop('张三')
names['张六'] = 42
```

但因为pop时会有一个返回值,所以其实上面代码可以合并:
`names['张六'] = names.pop('张三')`。

## 循环遍历字典
用for,但遍历后显示的是键,不是值
```
names = {'张三': 24, '李四': 25, '王五': 28, '赵六': '刘能'}
for x in names:
print(x)
显示:
张三
李四
王五
赵六
如果要显示值,则:
for x in names:
print(names[x])
```

## 多个value的怎么处理:
用“列表套字典”的形式:如图。

```
import random
questions = [{'题目':'3+2 = ', '答案':5, '难度系数' : 0.3},
{'题目':'1+2 = ', '答案':3, '难度系数' : 0.1},
{'题目':'30+12 = ', '答案':42, '难度系数' : 0.7},
{'题目':'39+21= ', '答案':60, '难度系数' : 0.9}
]
while 1==1:
# 做一个死循环一遍一直出题
i = random.randint(0,4)
print('下一题难度系数是:' , questions[i]['难度系数'])
s =int( input('请输入 ' + questions[i]['题目']+ '的答案:'))
# 注意是用加号连接,不是用逗号
if s==questions[i]['答案']:
print('恭喜答对了!继续答题')
else:
print('错!继续答题')
```
## 统计次数——同##open中的两个例子。
1、先文章分段
2、统计某段中人物1-12分别出现的次数
3、把值加到原数组中

txt:
“张三约李四去打王五,但是王五刚好没在家,于是张三又出主意说可以改天。张三这个人很不好,经常欺负李四他们。李四也不敢吭声。
李四看起来老实,其实很不老实,是个名副其实的两面派。王五真的是二百五。
王五妈妈经常说:“王五啊王五,你真的是个二百五。”
```
girls = {'张三':0,'李四':0,'王五':0}
f = open('Y:/Desktop/张三.txt','r',encoding = 'utf-8')
for s in f.readlines():
for name in girls:
girls[name] = girls[name] + s.count(name)
#详见open里面的readlines注释,s变成了一个由字符串构成的列表。
for k in girls:
print(k,'出现次数:', girls[k])
f.close()
```

# 9 str 类
上述各种字符串的操作,也可以用 str 类自带的方法解决:如
`s.replace('a','b')`

str.find('a'),默认返回的是'a'出现的第一次的**下标**
str.find('a', 6,10) 表示查找从下标 6 开始,找到下标是 10,如果没找到,返回-1
> 如果想查找到第二个'的' 下标,则可以先用 find 找到第一个'的'下标,在从其下标开始往后找。

所以可以用一个循环,每次找到下标,就从后一个开始找,就能找到所有的关键字了。

```
s = '找一个最爱的相爱的亲爱的人'
c = s.find('的')
while c != -1:
# 如果找不到,则 c 返回的是-1,所以可以来控制。不要写成while c < len(s),因为 c 是下标。
print('的出现在:'c)
c = s.find('的', c+1)
```
`s.rfind('xx')` 表示从后开始往前找
`s.strip()` 表示去掉最左右两头的空格,也有s.lstrip和s.rstrip就是去掉左边或者右边的空格

`s.replace(' ', '')` 表示去掉字符串里面的空格,但不改变字符串,如果要改变,则要写成`s = s.replace(' ', '')`

还有其他方法

`s.split()` 分割
分割完就变成了列表的形式

`'$'.join()` 拼接
意思是用$拼接两个字符串,如果只想接起来,则可以用空字符串拼接

如果要用+加号拼接,则可以直接写`'+'.join(a)`,这样的写法意思是,python 会自动识别'',或者[],或者()元组,将这三种都视为对象,所以可以直接`[20,30,33,20].count(20)`调用这种方法,只不过不便于阅读。
# 10 元组
`a = ('mm', 22, 'hello')`
与列表类似,只不过用圆括号标识,可以用不同类型的数据,但也同字符串一样不允许修改。
# 11 模块
## 如何引用模块
`import math`即可。可以简写`import math as m`
即可,后续就不用写math.sin(3),可以直接写m.sin(3) ,但如果后面又重新定义了m=7,则无法引用m.sin(3),也无法引用math.sin(3)了。
也可以写`from math import *` 但不推荐。

## 模块无法安装
可用cmd命令安装,如果需要更新pip,则可以用cmd 的cd命令找到python.exe文件夹,然后在upgrade。

## 自定义函数 def
比如数字转换中文。这个函数不需要在函数里面写for循环。

如果自定义函数无返回值,则最好也写一下return,只不过return后面不需要再写东西。
## 列表转字典 字典转列表
python中有一个字典类dict类。dict.fromkeys(列表, 默认值) 有两个参数。比如:
```
n = ['张三','李四','王五','赵六']
d = dict.fromkeys(n,55)
得出:
d = {'张三':55,'李四':55,'王五':55,'赵六':55}
```
dic.fromke


可以将所有def自定义的函数全部存放在一个类似mytools.py的文件中。下次只需要确保要调用的mytools.py与要输入的文件在同一个文件夹下, 就可以直接import mytools即可。调用时:`r = mytools.count('d:/desktop/张三.txt',n)`
即可。

## 数字转中文大小写
`def chNum(x):`
如果是532,可将各个位数识别出来,也可以直接‘伍叁柒’

## 安装第三方库 第17讲
用系统自带的pip命令行。不是在idle窗口中,而是在cmd命令行中输入pip list。
命令行输入pip提示非外部或内部指令:解决办法:https://jingyan.baidu.com/article/ca41422f8db0f05eae99ed84.html
由于org是国外网站,如果无法安装,可在国内的网站安装,输入pip install -i +网址 +插件名结巴
`pip install -i https://pypi.tuna.tsinghua.edu.cn/simple jieba`


## 炒股模块

## 解方程

## excel模块


```
import xlwings as xw
excel = xw.App() # 一定要先创建excel 的app才可以有下一步
excel.quit() # 用来退出excel程序。如果是关闭excel文件的,一般不用这个,用close()
wb = excel.books.open('C:/Users/zyt/Desktop/22222.xlsx') # 接下来就可以用wb来指定打开某个excel文件了
wb=excel.books.add() # 先add完再用save方法保存,不能直接在add括号中写路径,会出错
wb.save('C:/Users/zyt/Desktop/bbbb.xlsx') # 可以把打开的文件另存
wb.close() # 关闭excel文件
wb.sheets.add() # 增加一个sheet,可以括号里面加sheet的名字,可以用一个循环添加多个sheet,名字可以用占位符表示,如下图
wt = wb.sheets['第一张sheet'] # 可以写sheets[0],或者直接写sheet的名字。注意点后面是sheets类,而不是sheet类 不要写错
wt.name='hhh' # 改sheet名字
wt.clear() # 清空sheet内容,包括格式
wt.range() # 其余的range对象跟vba中差不多功能
wt.range('a1').color = 65533 #设置单元格格式黄色,不能写成rgb(253,255,0)
```

也可以把range赋值给一个变量x,就自动生成一个列表对象。


## python调用excel中的vba
创建对象m,
```
import xlwings as xw
app = xw.App()
wb = app.boos.open('C:/')
m = app.macro('VBA的名字') # 用macro方法,但这个方法是app.macro,不是wb.macro
m.run()
```

## os 第20讲
```
import os
x = os.listdir('c:/users/zyt/desktop') # 用listdir属性可以得到某个文件夹下所有文件的名字列表。
但listdir只返回第一层,如果要返回第二层 用walk方法,一般放for里面
for i in os.walk('c:/users/zyt/desktop')
```


# 爬虫
模块 urllib.request 模块中的urlopen功能
`from urllib.request import trlopent` 即可。也可以写import urllib.request
再用一个bs4 外挂中的 BeautifulSoup功能。

```
from urllib.request import urlopen
from bs4 import BeautifulSoup
r = urlopen('http://192.168.168.231:8080/WebReport/ReportServer?reportlet=PM%2FXMSZ%2FAssessmentReportQuery.cpt')
c = r.read()
#s = c.decode('gbk') ##在网页中点击F12,查找“charset”就可以得到该网页的编码方式,集团这个网站是gbk编码
bs_obj = BeautifulSoup(c, features = 'lxml')
# 有这一步以后暂时不需要上面的decode转换了。但是会提示。'UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("lxml"). '错误,如下图。只要加入 feature = 'lxml'即可
```


# 加载窗体
## 加载 fomr、单行文本框、按钮
在输入汉字时点击按钮,转化成拼音。这里要用到pinyin这个插件。详见“窗体.py”。
```
from tkinter import Tk
, Entry, Button # Entry是用来插入单行文本的框,Button是按钮
import pinyin
fm_main = Tk()
def ok():
print('hellohhhhhh')
def convert():
s = ent_hanzi.get() # 获取用户在文本框中输入的字符串
p = pinyin.get(s) # 用插件中的get方法,及可转换成拼音。如果用的是其他插件,估计方法名称不同。
ent_pinyin.insert('end', p) # 直接用文本框后面加个点,接insert方法,即可插入,两个参数,一个是指定插入的位置,如果是end就是光标后面,如果是‘0’,就是在最开始插入;第二个参数是插入的内容,也就是上一步中翻译好的拼音。
return
ent_hanzi = Entry(fm_main) # 创建单行输入框对象,命名为ent,调用Entry方法,括号内指定要显示在哪个form中,
ent_pinyin = Entry(fm_main)
btn = Button(fm_main, text = 'click here', command = convert) # 点击可执行自定义函数,用command直接跟函数名即可,无需引号。
ent_hanzi.pack() # 创建完以后,还需要对象的pack方法,才能加载显示
ent_pinyin.pack()
btn.pack()
fm_main.mainloop() # 这个是默认添加的
```
> 自定义函数必须写在调用的语句前,比如command前,如果写在command后面,则出错。


## 读取文本框内容、将内容写入文本框中
一些方法
[https://www.cnblogs.com/hackpig/p/8196480.html](https://www.cnblogs.com/hackpig/p/8196480.html)
读取:get即可。初学者容易犯的错误:不需要去管使用者一输入数据就去读取文本框中的内容,而只需要当他们按下button按钮以后再去读取。

## text插件
读取网络股市信息并显示在text控件中。
```
fm_main = Tk()
t1 = Text(fm_main)
f = open('Y:/user/desktop/zyt.txt')
f.write( t1.get(1.0,'end' ) ) #text 的get方法可以指定从哪个字符开始复制,1.0 的意思就是开始,end表示读到最后
```
