记录python量化学习过程

一.numpy:

1.简介

​ 是一个由多维数组对象,多种衍生的对象(如掩码式数组“masked arrays”或矩阵),以及一系列为快速计算数组而生的例程,包括数学运算、逻辑运算、形状操作、排序、选择、I/O、离散傅里叶变换、基本线性代数、基本统计运算、随机模拟组成的库

  • numpy数组在创建时就已经固定了尺寸,当尺寸发生改变时就会创建一个新的数组。

  • 在同一个给numpy数组中所有元素的数据类型都要一致,并在内存中占有相同的大小

  • numpy数组的运算比python中的列表数据类型运算啊更简洁,运算速度也更快

数值运算、仿真、深度学习中会经常使用numpy库中的函数,并且numpy通常与 scipy何matplotlib(绘图库)一起使用

2.ndarray数组:

​ 在numpy库中,最重要的对象是被称为ndarray的N维数组类型。它描述的是相同 类型的元素集合,可以使用基于零的索引访问该集合中的项目。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dOSZu4HE-1614432086129)(E:\图片,视频\图片\截图\屏幕截图 2020-10-28 093438.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OAh6KTpi-1614432086131)(E:\图片,视频\图片\截图\屏幕截图 2020-10-28 094054.png)]

数组函数案例:
numpy.arange():

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QNaFk1e3-1614432086132)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201028094604551.png)]

numpy.linspace():

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SKvqBKZN-1614432086135)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201028094928787.png)]

numpy.logspace:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JtpXDsDm-1614432086136)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201028095246296.png)]


nadrray数组元素的数据类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GLflupLV-1614432086137)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201028152606283.png)]

​ 数据转换:用astype方法,例如:

int_arr = numpy.array([1,2,3,4,5])  #创建整形数组

float_arr = int_arr.astype(numpy.float64) # 转换为浮点64位数据

astyoe会创建一个新的数组,即原始数据的一份拷贝。

3.ndarray数组的索引、切片和转置

​ nadarray数组的基本索引和切片与python内置容器对象一样,访问方式和访问普通数组差不多。

不同的有 : 访问arr[1] [2] 可以用arr[1,1]

ndarray数组的布尔索引和花式索引

​ 布尔索引:使用布尔数组作为索引,如arr[condition].其condition为由一个条件或多个条件组成的布尔数组。

import numpy
# nadrryde布尔索引
x = numpy.array([3,2,3,1,3,0])
#布尔数组的长度必须跟索引的轴长度一致
y = numpy.array([True,False,True,False,True,False])
print(x[y])  #[3,3,3]
print('x[y==False]') # [2,1,0]
print(x>=3) #[True False True False True False]
print(x[(x==2)|[x==1]]) #[2 1]
x[(x==2)|(x==1)] = 0
print(x) # [3,0,3,0,3,0]

​ 花式索引:使用整形数组作为索引

import numpy
# ndarray的花式索引:使用整形数组作为索引
x = numpy.array([1,2,3,4,5,6])
print(x[[0,1,2]]) #[1 2 3]
print(x[[-1,-2,-3]]) #[6 5 4]
x = numpy.array([[1,2],[3,4],[5,6]])
print(x[[0,1]]) # [[1,2],[3,4]]
print(x[[0,1],[0,1]]) #[1,4] 打印x[0][0] 和 x=[1][1]
print(x[[0,1]][:,[0,1]] #打印01行的01列 [[1,2],[3,4]]
#使用 numpy.ix_()增强可读性
print(x[numpy.in_([0,1],[0,1])]) #同上打印01行的01列[[1,2],[3,4]]
x[[0,1],[0,1]] = [0,0]
print(x) #[[0,2],[3,0],[5,6]]
ndarray数组的转置和轴对换

​ 数组的转置和轴对换只会返回源数据的一个视图,不会对源数据进行修改。

import numpy
# ndarray 数组的转置和轴对换
k = numpy.arange(9) #[0,1,.....8]
m = k.reshape((3,3)) #改变数组的shape复制生成二维的,每个维度长度为3的数组
print(k) # [0 1 2 3 4 5 6 7 8]
print(m) # [[0 1 2] [3 4 5] [6 7 8]]
# 转置(矩阵)数组:T属性 :mT[x][y] = m[y][x]
print(m.T) # [[0 3 6] [1 4 7] [2 5 8]]
# 计算矩阵的内积 xTx
print(numpy.dot(m,m.T)) #numpy.dot 点乘
# [[  5  14  23][ 14  50  86] [ 23  86 149]]
#高维数组的轴对像
k =  numpy.arange(8).reshape(2,2,2)
print(k) #[[[0,1],[2,3]],[[4,5],[6,7]]]
print(k[1][0][0]) # 4
# 轴对换 transpose 参数:由轴编号组成的元组
m = k.transpose((1,0,2)) #m[y][x][z]=k[x][y][z]
print(m) #[[[0 1],[4 5]],[[2,3],[6 7]]]
print(m[0][1][0]) # 4
#轴对换 swapaxes (axes: 轴),参数:一对轴编号
m = k.swapaxes(0,1) #将第一个轴和第二个轴对换 m[y][x][z] = k[x][y][z]
print(m) #[[[0 1],[4 5]],[[2,3],[6 7]]]
#使用轴对换进行数组矩阵转置
m = numpy.arange(9).reshape((3,3))
print(m) # [[0 1 2] [3 4 5] [6 7 8]]
print(m.swapxes(1,0)) # [[0 3 6] [1 4 7] [2 5 8]]
4.ndarray 通用函数

​ ndarray 数组除了支持运算符“+” “-” “*” “/” “%”等外,还支持一些Numpy的通用函数ufunc

​ Numpy提供常见的数学如sin,cos和exp,这些被称作通用函数ufunc。在numpy中,这些函数按数组的元素运算产生一个数组作为输出。

​ 通用函数ufunc包括如下函数

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jVkmQIwS-1614432086138)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201028213305453.png)]

  • 示例:
import numpy
#一元ufunc示例
x = numpy.arange(6)
print(x) #[0 1 2 3 4 5]
print(numpy.square(x)) #[0 1 4 9 16 25]
# 二元ufunc示例
x = numpy.array([[1,4],[6,7],[8,9]])
y = numpy.array([[2,3],[5,8],[10,11]])
print(numpy.maximum(x,y)) #[[2 4] [6 8] [10 11]]
print(numpy.minimun(x,y)) #[[1 3] [5 7] [8 9]]
print('对每一行的元素求平均 x.mean(axis=1)= ',x.mean(axis=1))
#[2.5 6.5 8.5]
print('对每一列的元素求平均 x.mean(axis=0)= ',x.mean(axis=0))
#[5.         6.66666667]
ndarray数组文件的保存和读取

Numpy提供了多种存取数组内容的文件操作函数。保存数组数据的文件可以是二进制格式也可以是文本格式,其中二进制格式的文件又分为Numpy专用的格式化类型和无格式类型。

  1. 二进制格式文件

    把文件保存为二进制格式:

    numpy.save(filename,ndarray)
    

    nadaray 为数组名

    读取二进制格式的文件:

    ndarray=numpy.laod(filename.npy)
    

    .npy为默认扩展名

    在numpy.laod(filename)中必须写上文件扩展名.npy,否则会报错

    numpy.load()函数可以自动识别.npz文件,并且返回一个类似

    于字典的对象,也可以通过数组名获取数组的内容

如果将多个数组保存到一个文件中,则可以使用numpy.savez(filename,arr1,arr2,…)

  1. 文本格式文件

    文本格式文件保存命令

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w4AAm1jv-1614432086139)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201029194408501.png)]

  2. tofile()函数和fromfile()函数

    将数组中的数据以二进制的格式存入文件,命令如下

    ndarray.tofile(filename)
    

    将数组中的数据以二进制的格式存入文件,但输出的数组并不保存数组形状和元素类型等信息。文件名后缀一般选.bin

    读入数据并保存到数组中,命令如下:

ndarray=numpy.fromfile(filename,dytpe)

当numpy.fromfifile()函数读入数据时,需要用户明确指定元素类型。

二.pandas库与数据处理

Pandas是Python Data Analysis Library的简称,是基于NumPy的一种工具,该工具是为了解决数据分析问题创建的。Pandas纳入了大 量的库和标准的数据模型,提供了能高效操作大型数据集所需的工具。

1.pandas数据结构

pandas核心数据结构是Series和DataFrame

Series:一维数组,与NumPy中的一维数组类似,与Python基本 的数据结构列表也很相近,其区别是列表中的元素可以是不同的数据类 型,而Series中则只允许存储相同的数据类型,这样可以更有效地使用内存,提高运算效率。

Time-Series:以时间为索引的Series。

DataFrame:二维的表格型数据结构,也称数据框。它的很多功能 与R语言中的data.frame类似,也可以将DataFrame理解为Series的容器

Series

Series 类似于一维数组与字典数据结构的结合。它由一组数据和数 据相对应的数据索引标签组成,而这组数据和索引标签的基础都是一个 一维ndarray数组,可将index索引理解为行索引

  1. 通过一维数组创建
import pandas as pd
series1 = pd.Series([1,2,3,4,5],index=None)
print(series1)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GZd948YS-1614432086140)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201029211608377.png)]

输出的最后一行是Series的数据类型,这里的数据类型都是int64。

  • 数据在第二列输出,第一列是数据的索引,在pandas中称为index

  • index参数是可以省略的。如果不带index参数或者像例子中出现

“index=None”,Pandas就会自动默认用index进行索引,类似于数组

  1. 通过字典的方式创建
import pandas as pd
series2 = pd.Series({'a':[1,2,3,4],'b':[5,6,7,8],'c':[9,10,11,12]})
print(series2)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fGAKIqNx-1614432086140)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201029211939074.png)]

DataFrame

DataFrame是一个类似于表格的数据结构,包含一组有序的列,每 列可以是不同的类型(数值、字符串、布尔值等)。它的索引包括列索 引和行索引。DataFrame的每一行和每一列都是一个Series,Series的name属性为当前数据框的行索引名或列索引名。

  1. 通过二维数组创建
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.array(np.arange(12)).reshape(4,3))
print(df1)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C0X2dAHo-1614432086141)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201029214620108.png)]

  1. 通过字典的方式创建
import pandas as pd
df2 = pd.DataFrame({'a':[1,2,3,4],'b':[5,6,7,8],'c':[9,10,11,12]})
print(df2)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0rSzFbGp-1614432086142)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201029214945322.png)]

2.股票数据使用
聚宽jqdata 包:jqdatasdk

使用方法 : 1.导入jqdatasdk 2.用户认证(需要自己去聚宽上面注册)3.获取数据

例如:

import jqdatasdk
jqdatasdk.auth("17602322205","322205")
jqdatasdk.get_price(security="000001.XSHE",frequency="1m")

例如:

import jqdatasdk
jqdatasdk.auth("17602322205","QSaction233")
data = jqdatasdk.get_price(security="000001.XSHE",start_date='2019-01-01',end_date='2020-05-16',frequency="1m")
print(data.tail(10))

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KlpRlBzK-1614432086143)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201031093009592.png)]

参数说明:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-olsTnudS-1614432086143)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201031093505116.png)]

QUANTAXIS数据 暂未成功安装包 未测试

QUANTAXIS数据获取日线数据的方法:

import QUANTAXIS as QA #导入模块
daf = QA.QA_fetch_get_stock_day(tdx`='tdx',code='600020',start_date='2018-08-01',end_date='2018-12-03','00') #获取股票数据
print('\ndf2.head()\n',df2.head())

参数都是字符串型,其中code是股票代码、start_date是起始日

期、end_date是结束日期、第四个参数选择复权方式。

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2sxWmAIh-1614432086144)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201031094519508.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fQIOW2wg-1614432086144)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201031094531147.png)]

Tushare数据

获取行情数据的方法如下:

import tushare as ts
ts.get_k_data(code=None,start=' ',end=' ',ktype='D',autype='qfq',index=False,retry_count=3,pause=0.001)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n8aY4kIp-1614432086145)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201031095006607.png)]

使用案例:

import tushare as ts
data = ts.get_k_data('600099',ktype='D')
print(data.tail(10))  #输出组后数据

本接口即将停止更新,请尽快使用Pro版接口:https://waditu.com/document/2

pro使用方法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iZ7n64xf-1614432086146)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201031113748283.png)]

import tushare as ts
pro = ts.pro_api()//初始化
pro = ts.pro_api('注册获得token填在这里')
df = pro.daily(ts_code='000001.SZ', start_date='20190201', end_date='20200210')  //股票接口爬取
print(df)

token码获取地址: https://tushare.pro/register?reg=360055

tushare pro 的token凭证码设置:

  1. 进入官网,登录 从头像上点击用户名,打开个人主页
  2. 点击接口token,点击右边纸张图标,复制;
improt tushare as ts
token=‘你复制下来的token’
ts.set_token(token)
pro=ts.pro_api()

再运行上面的代码:(pro使用方法 )

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mA4TOP1j-1614432086146)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201031101954800.png)]

在OpenDataTools数据表格中用last代替了close,使用前要先更换列名。

介绍了几种获取股票历史数据的方法,其实不同方法获取的股 票数据都是一样的,区别就是DataFrame的索引和表头(也叫列名)不 同。后面我们将会学习怎样转换为统一格式,以方便数据的计算和图形、图表的显示。

3.DataFrame数据操作
DataFrame数据的基本提取

DataFrame数据的基本操作主要涉及数据显示方面的操作,假定DataFrame数据名为df1。

  1. 查看全部数据,可以用
print(df1)
  1. 查看1列的命令格式:
DataFrame.Column
#查看名为df1的close列的命令:
print(df1['close '])
print(df1.close)
#查看多个列的命令:
DataFrame(['column1 ','column2 ',....])
#查看df1中多个列的命令;
print(df1[['date','close','high']])
  1. 查看前几行的命令格式:

    DataFrame.head(n=5)
    # 参数n 是开始多少行,默认等于5 比如查看前6行
    print(df1.head(6))
    
  2. 查看最后几行的命令

DataFrame.tail(n=5)
#参数n 是最后多少行,默认为5,如查看最后2行:
print(df1.tail(2))

5.查看所有数据值的命令格式:

DataFrame.values
#返回值为numpy.ndarray类型 例如:
print(df1.values)
  1. 查看所有列名的命令:
DataFrame.columns
# 返回值为列名的列表  例如;
import tushare as ts
pro = ts.pro_api()   #初始化
pro=ts.pro_api('fbe7c665bb29c87e9f7dcceeaf2cc71e6491ffb2158892c2446e7a19')
df1 = pro.daily(ts_code='000001.SZ', start_date='20190201', end_date='20200210')
bb = df1.columns  # 获s取列名
for c in bb:	#循环打印列名
	print(c,end=' ')

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZlVdFIAq-1614432086147)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201031110232411.png)]

  1. 查看索引列的命令格式:
DataFrame.index
# 返回值为索引值的列表
print(df1.index)
  1. 行列转置的命令格式;
DataFrame.T
# 例如,df1的行列转置命令如下
print(df1.T)
  1. 修改列名的命令格式:
DataFrame.rename(mapper=None,index=None,columns=None,axis=None,copy=True,inplace=False,level=None)
#其中涉及的参数及其含义如下:
#mapper,index,columns:映射的规则。
#axis:指定轴,可以是轴名称index或columns,或数字0或1,默认为index。
#copy:布尔值,默认为True,复制底层数据。
#inplace:布尔值,默认为False,指定是否返回新的DataFrame。如果为True,则在#原DataFrame数据上修改,返回值为None。
#level:int或level name,默认为None。如果是MultiIndex,就
#只重命名指定级别的标签
#更换列名 案例
import pandas as pd
df = pd.DataFrame({'a':[1,2,3],'b',[1,2,3]})
print(df)
# 1.修改列名a,b 为 A B
df.columns = ['A','B']
print(df)
# 2.只修改列名a 为 A
df.columns = ['a','b']
df2=df.rename(columns={'a':'A'})
print(df2)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KRAaYc2D-1614432086147)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201031111915618.png)]

DataFrame数据转化为Series数据

DataFrame数据为多列名,Series数据为单列名,可以用下面命令 将DataFrame数据转化为Series数据

#命令格式1
Series=DataFrame.column1
#命令格式2
Series=DataFrame['column1']
案例:
import tushare as ts
data = ts.get_k_data('600099',ktype='D')
s1 = data['close']
print(s1.head())
s2=data.open
print(s2.tail())
print(id(s1),id(s2))

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Fhm8ZNN-1614432086148)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101200310123.png)]

DataFrame数据的复制

由于DataFrame和Series的数据类型都是对象数据,因此不能用简单的变量赋值方式进行复制,只能使用copy()方法操作。

命令格式

DataFrame2 = DataFrame.copy()

返回的DataFrame2是新创建的DataFrame数据。

假 定 df1 是 DataFrame 数 据 。 如 果 df2=df1 , 则 id ( df1 =id(df2),即它们共用一份数据,因此不论是df1还是df2被修改,数 据都会改变。假如要创建新副本数据,就要用df3=df1.copy()函数,

此时id(df3)!=id(df1),它们分别是不同位置的数据。

DataFrame数据的对列切片

DataFrame数据可以进行切片操作或提取(截取)数列操作

# 操作格式如下,注意要用双括号[[]]
DataFrame2=DataFrame[['column1','column2'......]]
# 返回的DataFrame2是新创建的DataFrame数据
# 提取单列命令格式如下:
DataFrame3 = DataFrame[['column1']]
# 返回的DataFrame3是新创建的DataFrame数据

注意

如 果 单 列 名 用 单 中 括 号 , 返 回 的 就 是 Series 数 据 , 如

Series=DataFrame[‘column1’]。

DataFrame数据后面可以任意增加新列,但是Series数据不可以,

因为它的定义就是一维数组。

DataFrame数据的对行切片

DataFrame数据对行切片与列表的操作一样。

DataFrame数据切片命令格式如下:

DataFrame2 = DataFrame[index_start,index_end]

返回新的DataFrame数据。

注意

数据行中包含index>= index_start且index<index_end,也就是说在数据中不包含index_end行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T4ZM8UBm-1614432086149)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101201632872.png)]

DataFrame数据的loc [ ]和iloc [ ]操作

DataFrame.loc[]通过标签来选择数据,其格式如下:

DataFrame2=DataFrame.loc[row_indexer,column_indexer]
# 提取一列格式:
DataFrame.loc[:,'column']
# 提取多列格式:
DataFrame.loc[:,'column1' : 'columnN']
#提取特定行列格式:
DataFrame.loc[index1 : indexM ,'column1' : 'columnN']

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fIDq74bO-1614432086149)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101201830111.png)]

DataFrame.iloc[]通过位置索引来选择数据,其格式如下:

DataFrame2 = DataFrame.iloc[row_number,column_number] 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pKnbFXLt-1614432086150)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101201952375.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MqThdmbS-1614432086150)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101201956586.png)]

DataFrame数据的at [ ] 和iat [ ]操作

DataFrame数据的at[]和iat[]操作同loc[]和iloc[]操 作,区别是loc[]和iloc[]获取的是一组数据,而at[]和iat[]获取的是一个数值。

旧 版 本 中 DataFrame 行 列 数 值 获 取 使 用 的DataFrame.get_value ( index , column ) 方 法 都 需 要 换 为DataFrame.at[index,column]方法。

at格式:
DataFrame2 = DataFrame.at[index.column]
iat格式:
DataFrame2 = DataFrame.iat[index,column_number]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q1jXXMiE-1614432086151)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101202319744.png)]

DataFrame数据的条件提取

我们可以按照一些条件来获取满足要求的数据。

条件提取数据的格式:

DataFrame2=DataFrame[condition]

其中,condition是关于DataFrame数据的逻辑条件。

例如,利用print(d1[d1.close>11].head()) 把close>11

的数据提取出来。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p5cbzuCd-1614432086152)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101202450785.png)]

DataFrame数据的排序

我们可以按索引值(或列名)和列值对DataFrame数据或列数据进行排序,生成新的数据。

(1)按照索引值(或列名)排序的格式:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RWmadorF-1614432086152)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101202732417.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F3pht3mn-1614432086153)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101202740612.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zavzxz9N-1614432086153)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101202806214.png)]

DataFrame数据的插入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vt9Rqkfr-1614432086154)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101202914099.png)]

DataFrame数据的删除

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n482O6JC-1614432086155)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101203730323.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YcVwWHDL-1614432086155)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101203742366.png)]

DataFrame数据类型的转换

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XBaEYhn1-1614432086156)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101203848963.png)]

4.DataFrame无效值

在DataFrame数据中,经常存在无效值,显示为NaN(Not a

Number)。Pandas提供了一些方法可以判断、操作这些无效值。

无效值的判断

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0h0MHs3B-1614432086156)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101204208762.png)]

缺失值的填充

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-di734NIs-1614432086157)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101204238394.png)]

缺失值的删除

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G4BA8Ghz-1614432086158)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101204303842.png)]

重复值的删除

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KWrcgsvG-1614432086159)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101204330876.png)]

5.DataFrame索引操作

在量化分析中,DataFrame索引经常被用到。在Tushare股票历史

数据中索引是RangeIndex,在聚宽数据中索引是DatetimeIndex,在QUANTAXIS数据中索引是Index,因此我们会经常做不同索引项之间的转换。

在这里推荐使用RangeIndex,这种默认的索引很容易进行数据处 理 , 对 于 增 加 新 列 数 也 非 常 方 便 。 但 是 对 于 图 形 显 示 要 使 用DatetimeIndex,因为图形的纵坐标是日期或时间。

修改索引

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jw4vI2rf-1614432086160)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101204604997.png)]

重置索引

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c1ZcQ1Yp-1614432086160)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101204620674.png)]

6.DataFrame数据的追加与合并
DataFrame数据追加

如 果 两 个 DataFrame 数 据 的 列 名 相 同 , 就 可 以 将 这 两 个DataFrame数据合并成一个。

格式如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cki6tsk4-1614432086161)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101204849500.png)]

其中,other是其他的DataFrame数据、Series数据、列表数据

等;ignore_index默认为False,如果是True,就不使用索引标签;verify_integrity默认为False,如果是True,就提高ValueError和重复创建索引;sort=False表示不排序。

例如:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iu3WyK7o-1614432086161)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101204913143.png)]

DataFrame数据合并

合并两个DataFrame数据可以使用如下格式:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SZ9ORnYr-1614432086162)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101205138003.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A3WZ4wcw-1614432086163)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101205150217.png)]

DataFrame 通过索引拼接列

内置的join方法是一种快速合并的方法,它以index作为对齐的列,可以把一个DataFrame数据列合并到另一个DataFrame数据中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wsUzsMDC-1614432086163)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101205559962.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vlBiqAEj-1614432086164)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101205616775.png)]

DataFrame通过轴连接

pandas.concat方法可以沿着一条轴将多个DataFrame数据堆叠到 一起。concat方法相当于数据库中的全连接,可以指定按某个轴进行连 接,也可以指定连接的方式,如join方法(参数outer或inner)。与数 据库不同的是,concat方法不会去重,要达到去重的效果可以使用drop_duplicates方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h5T8YgAI-1614432086165)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101205657100.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eL9CZJr4-1614432086166)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101205706856.png)]

7.DataFrame数据的保存和读取

由于Pandas是数据库分析专用库,因此其读取和保存(或写入)的接口函数或方法很多

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jVDXVwp0-1614432086166)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201101210139651.png)]

介绍csv和excel文件的使用

保存CSV

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w6duQNUO-1614432086167)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201102145006716.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p6m2Dwzh-1614432086168)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201102145022334.png)]

例如:

# 下载tushare基本数据
import tushare as ts
import pandas as pd
datapath = '\\xbdata'
base=ts.get_stock_basics()
base.to_csv(datapath+'\\stock_base.csv',encoding='gbk')

遇到报错:

No such file or directory: ‘\xbdata\stock_base.csv’

暂未去查询正确的地址

读取CSV

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QtuVNIUS-1614432086168)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201102150033762.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p91NJSUj-1614432086169)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201102150054122.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VHnGOM1m-1614432086169)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201102150138990.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iSriD9i9-1614432086170)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201102150203230.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a1TpkhJ0-1614432086170)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201102150214685.png)]

示例:

import pandas as pd
# 读取xbdata目录双色球开奖数据
def get_ssq():
	base=pd.read_csv('\\xbdata\\cp\\ssq.csv',encoding='gbk')
	return base
print(get_ssq().head(5))

文件不存在。。。。。

保存Excel格式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z9VUFlxY-1614432086171)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201102152047536.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-33dMtMPO-1614432086172)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201102152102178.png)]

示例:

import pandas as pd
import tushare as ts
df = ts.get_k_data('600080',ktype='D')
df1 = df.head()
df2 = df.tail()
writer = pd.ExcelWriter('output.xlsx')
df1.to_excel(writer,'Sheet1')
df2.to_excel(writer,'Sheet2')
writer.save()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nb758BDy-1614432086172)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201102152907381.png)]

读取Excel 读取Excel的格式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GBQg6Nei-1614432086173)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201102152946157.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z4vpnOxo-1614432086173)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201102152957564.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sctL7fUo-1614432086174)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201102153006062.png)]

示例:

import pandas as pd
rd1 = pd.read_excel('output.xlsx','Sheet1')
rd2=pd.read_excel('output.xlsx','Sheet2')
print(rd1)
print(rd2)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TseeVk2l-1614432086175)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201102153458293.png)]

8.DataFrame运算
DataFrame列数据的运算

DataFrame 列 数 据 支 持 + , - , * , / , ** 等 运 算 , 如

x=df.close*2

DataFrame的统计方法

DataFrame的统计方法非常丰富,常用的统计方法及功能见表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YIbwn5S2-1614432086175)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201102153905826.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wwzVgJXR-1614432086176)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201102153926210.png)]

统计案例:

import tushare as ts
df1 = ts.get_k_data('000776',ktype='D').head()
print(df1)
print('求各列的平均值')
df2=df1.mean(axis=0,skipna=False ) # 求各列的平均值,考虑na的存在
print(df2)
print('求各列的最大值')
df3=df1.max(axis=0,skipna=False) #求各列的最大值,考虑na的存在
print(df3)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2cB7Tvgh-1614432086176)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201102154444821.png)]

9.DataFrame数据画线

Pandas具有简单绘制数据线的功能,可以绘制折线图、条形图等。绘制简单的图形也可以直接使用DataFrame.plot方法。

DataFrame.plot方法绘图的函数格式如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EgLV3WbR-1614432086177)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201102154619786.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uWVHpRYF-1614432086177)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201102154818384.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JKZs9vXm-1614432086178)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201102154938208.png)]

示例:

import tushare as ts
df = ts.get_k_data('000776',ktype='D').head()
df.open.plot.line(legend=True)
df.low.plot.bar(legend=True)

没动静,,,不知道什么原因

10.仿通达信大智慧公式指标KDJ
构造基础行情数据
编写股票公式的基础函数
通达信公式转为python代码
使用kDJ函数
将K,D,J合成到mydf中
显示KDj指标线

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7WLhurhF-1614432086179)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201102162134379.png)]

三、Matplotlib模块

Matplotlib是Python最重要的绘图库。为了绘图方便,Matplotlib的Pyplot模块提供了类似于MATLAB的界面。高级用户可以通过面向对 象的界面,或类似于MATLAB的一组函数来完成控制线条样式、字体属 性、轴属性等的设置。Matplotlib是可用于Python脚本的图形用户界面 的工具包,它可以让简单的事情变得更简单,让无法实现的事情变得有 可能实现。它仅用几行代码就可以生成绘图、直方图、功率谱、条形 图、错误图、散点图等,还能方便地将这些图作为绘图控件嵌入GUI应用程序中。

1.Matplotlib的使用

Pyplot模块是Matplotlib的绘图子库,我们通常使用别名“plt”

Matplotlib能够产生不同的输出,而每一个输出的能力叫作一个后端。 其前端是用户需要处理的代码,如绘图代码;后端是生成视图窗口。Matplotlib把不同的使用情形和输出格式作为目标,而使用者利用Matplotlib在Python Shell上的交互,即输入命令就能弹出绘图窗口。 另外,也可以将Matplotlib嵌入到其他的用户图形接口中来编写丰富的应用程序。

Pyplot模块是Matplotlib的绘图子库,我们通常使用别名“plt”

import matplotlib.pyplot as plt
matplotlib 选择输出后端

为了支持所有的使用情形,Matplotlib能够产生不同的输出,而每一个输出的能力叫作一个后端。 其前端是用户需要处理的代码,如绘图代码;后端是生成视图窗口。Matplotlib把不同的使用情形和输出格式作为目标,而使用者利用Matplotlib在Python Shell上的交互,即输入命令就能弹出绘图窗口。 另外,也可以将Matplotlib嵌入到其他的用户图形接口中来编写丰富的应用程序。

这里有两种不同类型的后端:

( 1 ) 用 户 接 口 后 端 , 又 称 交 互 式 后 端 , 如 GTK3Agg , GTK3Cairo , macOS , nbAgg , Qt4Agg , Qt4Cairo , Qt5Agg ,Qt5Cairo , TkAgg , TkCairo , WebAgg , WX , WXAgg ,WX,Cairo。

(2)硬拷贝后端,又称非交互式后端,用来生成图像文件,如

agg,cairo,pdf,pgf,ps,svg,template。

设置后端命令格式:

只有matplotlib 2.0.2需要,高版本可不用设置

matplotlib.use(arg,warn=False,force-True)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C7x4sluM-1614432086179)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201103191535050.png)]

后端字符串说明:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2x39hmT8-1614432086180)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201103191859955.png)]

Matplotlib选择Tkinter后端

Matplotlib选择Tkinter后端输出图形的过程。

(1)需要加载的几行模块命令如下:

import tkinter
import matplotlib
import matplotlib.pyplot as plt
form matplotlib.backends.backend_tkagg import FigureCanvasTkAgg,NavigationToolbar2TkAgg

(2)在绘图前先使用如下命令,选择Tkinter为图形输出后端。

matplotlib.use('TkAgg')

(3)设置fifig绘图窗口,并在窗口中使用plt绘图。

fig = plt.figure()

(4)建立Tkinter窗口。

root = tkinter.Tk()

(5)设置一个Tkinter绘图区"canvas"

canvas = FigureCanvasTkAgg(fig,master=root)  #设置tkinter绘图区
canvas.draw()    #绘制plt图形

(6) 可以选择使用plt图形导航工具条NavigationToolbar

toolbar = NavigationToolbar2TkAgg(canvas,root)    #plt图形导图工具条
toolbar.update()    #显示plt图形导图工具条

(7)在Tkinter窗口中放置canvas并显示

canvas._tkcanvas.pack(side=tkinter.TOP,fill=tkinter.BOTH,expand=1)

(8)运行Tkinter的mainloop()主循环命令

tkinter.mainloop()

2.matplotlib的画图流程

matplotlib.pyplot是Matplotlib的一个基本绘图接口,它提供了一 个类似于MATLAB绘图的方法

如果的是Spyder软件,则需要先进行设置使软件能显示Pyplot窗口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WqjbYIiC-1614432086181)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201103195315709.png)]

设置完成后重新启动Spyder。

说明:只有在本章学习Pyplot时才需要选“Automatic”,后面在学习量化时要改回“Inline”。

pylolt画图的流程
(1)绘图库加载
import matplotlib.pyplot as plt
(2)创建一个显示窗口“fifig1”。
fig1 = plt.figure('fig1')

我们可以创建多个窗口,如fifig2 = plt.fifigure(’ fifig2’)。在程序中,可以使用命令plt.fifigure(fifig1.number)选择要输出的窗口

(3)创建子图(不需要则可以跳过此步):
plt.subplot(211)   #第一个画板的第一个子图
plt.subplot(212)   #第二个画板的第二个子图
(4)设置图形标题,子图标题命名为fifigure1。
plt.title('figure1')
(5)在子图上绘图。
plt.plot([1,2,3])
(6)显示Pyplot窗口及绘制图形.
plt.show()   #显示plt窗口及绘制图形
pyplot的相关说明

(1)在绘图库加载“import matplotlib.pyplot as plt”后,用plt

方法完成全部操作。

(2)创建窗口或选择窗口用 plt.fifigure()方法,其中创建的窗口 是队列。它是先进先出的,因此,plt.close()方法第一次关闭的是最早创建的一个窗口。创建的第一个窗口“fifig1.number”的编号为1,第二个窗口“fifig2.number”的编号为2。

注意:当使用plt.fifigure(2)时,如果没有创建编号为2的窗口,就会自动创建,并且当 前窗口指针指向编号为2的窗口;如果已经存在编号为2的窗口,当前窗口指针就指向编号为2的窗口,后面的操作都是针对默认的指针指向的窗口编号进行的。

(3)在默认窗口中,plt.subplot()具有创建子图和选择子图的功能。

示例:

import tushare as ts
import matplotlib.pyplot as plt
df1 = ts.get_k_data('600080',ktype='D')
fig1=plt.figure('fig1')    #创建第一个画板
plt.subplot(211)   #第一个画板的第一个子图
plt.title('figurea')
plt.plot(df1.open)
plt.subplot(212)    #第二个画板的第二个子图
plt.title('figureb')
plt.plot(df1.low)
plt.legend()      #显示图例
fig2=plt.figure('fig2')    #创建第二个面板
plt.title('figure2')
plt.plot(df1.high)     #默认子图命令是subplot(111)
plt.legend()
plt.figure('fig3')    #创建第三个面板
plt.title('figure2')
plt.plot([1,2,3])
plt.figure(fig1.number)    #选择第一个面板
plt.subplot(211)    #选择画板的第一个子图
plt.plot(df1.close)
plt.legend()
plt.show()    #显目plt窗口及绘制图形

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IR8UXtnE-1614432086181)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201103215113384.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nP2cSKCu-1614432086182)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201103214751836.png)]

创建绘图窗

matplotlib.pyplot创建绘图窗的方法为fifigure(),其语法格式如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DYVSo0ub-1614432086182)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201103215059769.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GviLHvzl-1614432086183)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201103215126258.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jKKSqCjB-1614432086184)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201103215456206.png)]

创建一个子绘图区域

创建一个子绘图区域‘subplot’的格式:

matplotlib.pyplot.subplot(*args,**kwargs)

参数说明:

* args:一个三位数的整数或三个整数描述次要情节的位置。如果 三个整数分别是“nrows”网格行、“ncols”网格列与子图位置号,则索引 从1开始在左上角增加。

**kwargs:这种方法可以设置子图属性,参数非常多,其中常用的 参数有anchor,facecolor,fc,label,title,xlabel,visible,ylabel等。

例如,利用“fc=‘r’”更改背景色;利用“title=‘子图标题’”修改标题。通常用法如下:

subplot(nrows,ncols,index,**kwargs)
subplot(pos,**kwargs)
subplot(ax)

如 果 没 有 用 fifigure ( ) 方 法 创 建 窗 口 , 那 么 在 第 一 次 使 用subplot()方法时,就会自动创建Figure1窗口.ax1=plt.subplot(221)和ax1=plt.subplot(2,2,1)的功能 相同,但是subplot(221)只能是111~999的数字,不能为0,且每 段不能超过10。subplot(2,2,1)可以超过10,如subplot(12,14,4)等。例如,subplot(111)表示把图形分为1行1列,且激活第 1个子图区域绘图。子图区域从1开始数,先行后列。subplot(3,4, 5)表示图形分为3行4列,且激活第5个子图区域绘图。

例如,创建一个子绘图区域“ax1‘

ax1=plt.subplot(224,sharex=ax1,fc='r',title='bbb)

删除子绘图区域:

plt.delaxes(ax1)
创建一个网格子绘图区域

创建一个网格子绘图区域’subplotlib2grid()'的语法格式如下:

matplotlib.pyplot.subplot2grid(shape,loc,rowspan=1,colspan=1,ig=None,**kwargs)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UlAvg2Ef-1614432086184)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201104195243663.png)]

通用语法如下:

ax = subplot2grid(shape,loc,rowspan=1,colspan=1)

如 果 没 有 用 fifigure ( ) 方 法 创 建 窗 口 , 那 么 在 第 一 次 使 用subplot2grid()方法时,就会自动创建Figure1窗口。

案例:

import matplotlib.pyplot as plt
ax1 = plt.subplot2grid((3,3),(0,0),colspan=3)
plt.plot([1,2,3])
ax2 = plt.subplot2grid((3,3),(1,0),colspan=2)
plt.plot([3,5,3])
ax3 = plt.subplot2grid((3,3),(1,2),rowspan=2)
plt.plot([5,3,1])
ax4 = plt.subplot2grid((3,3),(2,0))
plt.plot([1,5,2])
ax5 = plt.subplot2grid((3,3),(2,1))
plt.suptitle('subplot2grid')
plt.plot([5,1,5])
plt.legend()
plt.show()

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QTLR1WiV-1614432086186)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201104200038309.png)]

调整子绘图区域布局

为了让绘图区更美观,我们可以使用subplots_adjust()命令调整子图之间的布局。

命令格式如下:

matplotlib.pyplot.subplots_adjust(left=None,bottom=Nome,right=None,top=None,wspace=None,hspace=None)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-blS3cZ8E-1614432086186)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201104200252942.png)]

创建一个轴图

Axes层也称轴图、坐标层,是建立在Figure上的一个坐标系。

命令格式如下:

matplotlib.pyplot.axes(args=None,**kwargs)
一般用法:
plt.axes()
plt.axes(rect,projection=None,polar=False,**kwargs)
plt.axes(ax)

axes()方法的参数说明

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2nV2R2tG-1614432086187)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201104201746566.png)]

案例:

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']   #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False    #用来正常显示负号
np.random.seed(20190902)
# 创建一些数据
dt = 0.001
t = np.arange(0.0,10.0,dt)
r = np.exp(-t[:1000]/0.05)      #impulse response
x = np.random.randn(len(t))
s = np.convolve(x,r)[:len(x)] * dt    #colored noise
# 主要axes默认subplot(111)
plt.plot(t,s)
plt.axis([0,1,1.1 * np.min(s),3 * np.max(s)])
plt.xlabel('time (s')
plt.ylabel('current (nA)')
plt.title('高斯彩色噪声')
# 这是一个嵌入在主axes的子axes
a = plt.axes([.65,.6,.2,.2],facecolor='w')
n,bins,patches = plt.hist(s,400,density=True)
plt.title('概率')
plt.xticks([])
plt.yticks([])

plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XkeqHhvO-1614432086188)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201104202921281.png)]

2.有关pyplot显示的方法

为了能够正确地显示中文,我们需要在程序的开始增加两行命令进行字体和字符集的设置。

plt.rcParams['font.sans-serif']=['SimHei']   #用来正常显示中文标签

plt.rcParams['axes.unicode_minus']=False    #用来正常显示负号

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ic1QGzJt-1614432086189)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201104203143125.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JnxcNhM1-1614432086189)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201104203232222.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zGjiVxzm-1614432086190)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201104203245398.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sfqPyJYM-1614432086191)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201104203256479.png)]

3.pyplot常用绘图方法

matplotlib.pyplot的绘图方法很多,其中常用的如下:

(1)plt.plot(x,y,label,color,width):根据x,y数组绘

制直线、曲线。

(2)plt.boxplot(data,notch,position):绘制一个箱型

图。

(3)plt.bar(left,height,width,bottom):绘制一个条形

图。

(4)plt.barh(bottom,width,height,left):绘制一个横向条形图。

(5)plt.polar(theta,r):绘制极坐标图。(6)plt.pie(data,explode):绘制饼图。

(7)plt.psd(x, NFFT=256, pad_to, Fs):绘制功率普密

度图。

(8)plt.specgram(x, NFFT=256, pad_to, F):绘制普

图。

(9)plt.cohere(x,y,NFFT=256,Fs):绘制“x-y”的相关性

函数。

(10)plt.scatter():绘制散点图,其中x,y是长度相同的序

列。

(11)plt.step(x,y,where):绘制步阶图。

(12)plt.hist(x,bins,normed):绘制直方图。

(13)plt.contour(X,Y,Z,N):绘制等值线。

(14)plt.clines():绘制垂直线。

(15)plt.stem(x,y,linefmt, markerfmt, basefmt):

绘制曲线每个点到水平轴线的垂线。

(16)plt.plot_date():绘制数据日期。

其中,plt.plot()方法是画线程序,命令格式如下:

matplotlib.pyplot.plot(*args,scalex=True,scaley=True,data=None,**kwargs)

这 个 方 法 用 法 很 多 , 其 中 简 单 的 用 法 有 plot ( [ x ] , y ,[ fmt ] , data=None , ** kwargs ) 。 其 中 , x , y 是 函 数 值y=f(x),fmt是线的属性。data是关于(x,y)的数据对象。 ** kwargs用于指定Line2D的属性,如线、抗锯齿、颜色等。

字符串格式如下:

fmt='[color][marker][line]'

其中,color支持颜色缩写

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1wInHuSc-1614432086191)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201104203834004.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UkXP8ntM-1614432086192)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201104203907082.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P2RZ2lAK-1614432086193)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201104203921593.png)]

例如:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UlWY7I11-1614432086193)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201104203951329.png)]

4.共享x坐标轴画图

需要使用 twinx()方法

命令格式:

matplotlib.pyplot.twinx(ax=None)
例如,ax2和ax1轴图共享x轴
ax2 = plt.twinx(ax1) #ax2和ax1 轴图共享x轴

案例:

如果把成交量和收盘价走势图放到一起,那么图形就一定非常乱, 而我们关注的重点是收盘价的趋势,成交量仅仅是判断趋势的一个因素。为了不使成交量喧宾夺主,可以把成交量和成交量均线都设置为透 明的,这样就主次分明了。其中,参数alpha代表透明度,1是不透明, 0是透明,我们设置为alpha=.2。

import pandas as pd
import matplotlib.pyplot as plt
import tushare as ts
import time
ds = '2019-06-01'
de = time.strftime('%Y-%m-%d', time.localtime(time.time()))   #今天的时间
plt.rcParams['font.sans-serif']=['SimHei']    #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    #用来正常显示负号
df1 = ts.get_k_data('600030', ktype='D', start=ds, end=de)
ma5=pd.Series.rolling(df1.close, 5).mean()    #股票收盘价5日均线
ma20=pd.Series.rolling(df1.close, 20).mean()    #股票收盘价20日均线
plt.figure(2,figsize=(12, 8), dpi=80)
plt.rcParams['font.sans-serif']=['SimHei']    #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False    #用来正常显示负号
ax1=plt.subplot(111)
plt.plot(df1.close, '.-')    #显示股票close
plt.plot(ma5,)    #显示MA5
plt.plot(ma20,)    #显示MA20
plt.legend(['CLOSE', "MA5", "MA20"])    #设置标签
plt.grid()    #显示网格
plt.suptitle('股票加个平均线', fontsize=12)    #设置图形标题
plt.xlabel('周期')    #显示x轴标签
plt.ylabel('价格')    #显示y轴标签
ax2 = plt.twinx(ax1)
plt.bar(df1.index, df1.volume, facecolor='#386d13', alpha=.2)
vma5=pd.Series.rolling(df1.volume, 5).mean()    #股票收盘价5日均线
plt.plot(vma5, 'm', alpha=.2)    #显示VMA5
plt.legend(['volume', 'VMA5'])    #设置标签
plt.ylabel('成交量')    #显示y轴标签
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TTETWlPW-1614432086194)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201104212057061.png)]

5.绘制k线图

K线图是股票软件中最常见的图形。K线又称为蜡烛图,起源于日本。K线图有直观、立体感强、携带信息量大的特点,蕴涵着丰富的东方 哲学思想,能充分显示股价趋势的强弱、买卖双方力量平衡的变化,且 能较准确地预测后市走向。目前,已经形成了一套完善的K线分析理论。 技术分析中的重要流派——K线派,就是专门以研究K线的形状和组合为基础的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-23zuOKt5-1614432086194)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201106181213483.png)]

日K线是根据股价(指数)在一天的走势中形成的四个价位——开盘价、收盘价、最高价、最低价绘制而成的。在收盘价高于开盘价时,开盘价在下收盘价在上,二者之间的长方 柱用红色或空心绘出,称为阳线。其上影线的最高点为最高价,下影线的最低点为最低价。在收盘价低于开盘价时,开盘价在上收盘价在下,二者之间的长方 柱用黑色或实心绘出,称为阴线。其上影线的最高点为最高价,下影线的最低点为最低价。

“date”日期时间,“close”收盘价,“high”最高价,“low”最低价,“open”开盘价,“volume”成交量。

当获取的股票行情数据的列表名都不相同时,先要转化为自己定义 的 列 表 格 式 “ [ index , date , open , close , high , low ,volume]”。

我们使用系统默认的画K线的candlestick_ohlc()方法。

在matplotlib 2.0.2版本中自带此方法,使用如下语句
from matplotlib.finance import candlestic_ohlc #仅用于matplotlib 2.0,2版

在matplotlib 3.0.2版中,如果取消了此方法,就需要自行安 装mpl_fifinance包。pip install mpl_finance

安装成功后使用如下语句

from mpl_finance import candlestick_ohlc #仅用于matplotlib 3.0.2 版

使用candlestick_ohlc()方法绘制出来的K线不是连续的,在周末和节假日K线就会留下很大一段空白,这非常影响对K线走势的观察。因此,我们要做一些修改以去掉图形中的空白。

#显示k线图和5日,20日均线
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import ticker as mticker
import tushare as ts
import time
from mpl_finance import candlestick_ohlc
plt.rcParams['font.sans-serif']=['SimHei']    #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    #用来正常显示负号
ds = '2019-06-01'    #开始日期
de = time.strftime('%Y-%m-%d', time.localtime(time.time()))   #今天的时间
df1 = ts.get_k_data('600030',ktype='D',start=ds,end=de)
df2 = df1.copy()
df2.dropna(inplace=True)     #删除无效数据
date_tickers=df2['date']    #刻度线
df1 = df2['date']
df2['date']=df2.index
ma5 = pd.Series.rolling(df2.close,5).mean()     #股票收盘价5日均线
ma20 = pd.Series.rolling(df2.close,20).mean()     #股票收盘价20日均线
fig, ax = plt.subplots()
days = df2.reindex(columns=['date','open','high','low','close'])
ax.tick_params(axis='y',colors='b')
ax.tick_params(axis='x',colors='b')
plt.title('股票k线图')
plt.ylabel('Stock price')
candlestick_ohlc(ax,days.values,width=0.75, colorup='r', colordown='g')
ax.plot(days.date.values,ma5,label='MA5',linewidth=1.5)
ax.plot(days.date.values,ma20,label='MA20',linewidth=1.5)
ax.grid(True, color='r')
ax.xaxis.set_major_locator(mticker.MaxNLocator(6))     #x轴分成几等分
ax.xaxis.label.set_color('b')
ax.yaxis.label.set_color('b')
plt.legend(['MA5','MA20'])     #显示图中右上角的提示信息
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XTvLPvaw-1614432086195)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201106190220643.png)]

柱状图不明显 。。。

四、Tkinter模块

Tkinter是Python的标准GUI库,它是一个跨平台的脚本图形界面接 口,能够开发各种图形界面且可以快速创建GUI应用程序。由于Tkinter已经内置到Python的安装包中,因此只要安装好 Python就能导入Tkinter库。

小白量化投资软件采用的就是Tkinter搭建的图形框架

在Tkinter中,图形单元称为部件(Widget),也称为控件或组件。

1.Tkinter的使用

为了便于书写程序和区分不同库中的函数或方法,我们一般会给Tkinter模块加上“tk”别名。

Tkinter的使用流程
  • 导入Tkinter模块

  • 创建主窗口

  • 创建控件,如创建label标签控件等。

  • 把控件通过pack布局管理方法放到窗口中。

  • 进入Tkinter主循环

import tkinter as tk     #导入Tkinter模块
root = tk.Tk()    #创建Tkinter窗口对象
root.title(string = '窗口标题')    #设置窗口标题
label=tk.Label(root,text='窗口内容在此')    #创建label标签控件
label.pack()    #pack()方法用来设置空间在窗口中的位置、大小等
root.mainloop()     #进入Tkinter消息循环

运行结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HZTzmj2n-1614432086196)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201106192934144.png)]

Tkinter创建的第一个Tk()对象是Tkinter的主窗口对象。Tk主窗 口主要是管理Tkinter的应用程序,因此一般称为root(windows、app)

Tkinter有很多不同的控件,如Button,Canvas,Frame,Label等 。 在 有 些 容 器 控 件 中 还 可 以 放 置 其 他 的 控 件 , 如Frame ,LabelFrame,Canvas,Text,PanedWindow,Notebook等;普通控件不能放置其他控件,如Button,Label等。

控件在容器中放置的几何管理方法有顺序放置“pack()”方法、网格放置“grid()”方法、绝对位置放置“place()”方法。

Tkinter程序设计的总体思路:一般来说,设计窗口或控制面板最好 使用Frame.grid()方式,即在Frame中填充不同颜色进行调整,调整完成后再把所需要的控件用pack()方法放置到Frame容器中。

Tkinter的变量类

Tkinter有自己的变量类,这与Python变量有点区别。Tkinter的变 量类主要用于设置Tkinter控件,或绑定Tkinter控件。如果Tkinter的变 量值改变了,Tkinter系统就可以使用跟踪功能更新那些设置了这个变量 的相关控件中关键字的属性值,即通过修改Tkinter变量值来动态实现改 变Tkinter控件的属性。

例如,Label 控件的textvariable 关键字属性就需要设置一个Tkinter变量StringVar。如果StringVar变量值被修改,Label文本就会自动更新StringVar变量值。

在Tkinter系统中,有变量类的基类“Variable”,基类又派生出其他 变 量 类 , 如 StringVar ( 字 符 型 ) 类 、 IntVar ( 整 型 ) 类 、DoubleVar(双精度浮点型)类和BooleanVar(布尔型)类。

这些由基类派生出来的变量类除变量数值类型不同外,其他属性和方法都是相同的

  • StringVar类的用法。
在使用过程中,先要创建Tkinter变量对象,其语法格式如下:
var = tk.Variable(master=None,value=None)

其中,如果master省略或值为None,则自动设置为Tkinter全局变 量“Tk()对象root”。在创建Tkinter变量对象的语句之前,必须先创建Tk()全局对象root,即在root=tk.TK()语句后才能正常创建Tkinter变量对象。

value可实现创建变量对象的同时赋值给value参数值。

Tkinter变量对象的主要常用操作有两个:设置值“.set()”方法和获取值“.get()”方法。具体用法如下:

1.设置Tkinter变量对象的值
root = tk.Tk()    #创建Tkinter 窗口对象
var = tk.StringVar()     #创建StringVar()字符变量对象
var.set('新值')     #设置变量
2.获取Tkinter变量对象的值
var=tk.StringVar()    #创建stringvar()字符变量对象
var=set('新值')    #设置变量var
str=var.get()    #获取var变量对象中的值

除了上面两种方法外,还包括一些跟踪(trace)类的方法,这些类都以“trace”字符串开头。具体用法如下:

1.添加一个变量的跟踪,trace_variable方法同trace方法
cbname=var.trace(mode,callback)
cbname=var.trace_variable(mode,callback))
2.删除要给个便两个的跟踪
var.trace_cdelete(mode,cbname)
3.返回所有跟踪回调信息
var.trace_vinfo()

添加一个变量的跟踪,用于在某种“mode”被触发的时候调用callback函数。mode模式字符串有r,w,u三种模式,其中r表示跟踪 的变量被读取,w表示跟踪的变量被改写,u表示跟踪的变量被删除或未赋值。

cbname是trace_variable()方法在创建跟踪时返回的字符串。

案例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fkZcwG8L-1614432086196)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201106200350724.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nl2ffOtz-1614432086197)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201106200404928.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c3jFZPxX-1614432086197)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201106200423491.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-feSd0ahY-1614432086198)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201106200512152.png)]

2.Tkinter控件的属性

由于Tkinter控件都继承于Widget类,因此它们拥有共同的属性和

方法。

Tkinter控件的标准属性

个别属性是一些控件的特有属性,如command属性只有按钮Button控件才会有。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tpDsj4wX-1614432086199)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201106202308907.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ZPmKY5j-1614432086199)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201106202326832.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W85DFPNC-1614432086201)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107152927623.png)]

修改控件的关键字属性值有三种方式

1.在创建对象时,使用关键字参数。例如:

label = tk.label(root,text='label',fg = 'red', bg = 'blue')

其中,关键字参数有text,fg,bg。在创建对象后,将选项名称视

为字典索引。

(2)更改或配置控件属性。

由于控件的属性类似于字典索引,因此可以用修改字典数据的方式

修改控件属性。例如

label ['fg'] = 'red'
label ['bg'] = 'green'

(3)使用confifig()方法更新控件对象创建后的多个属性值。

例如,同时修改Label的多个属性。

label.config(fg = 'yellow',bg = 'blue')

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S9WeDcXv-1614432086202)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201106204411526.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9JlcAavF-1614432086202)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201106204418220.png)]

Tkinter 属性的值和单位

由于Tkinter控件的不同属性具有不同的功能,因此它们的取值和单

位都不相同

维度单位

Tkinter的维度单位是各种长度“Lengths”、宽度“Widths”和其他控件维度单位的描述。

(1)如果一个维度被设置为一个整数,那么它就是像素单位。

(2)可以指定一个包含数字和维度单位“c, i, m, p”的字符串,其中c表示厘米,i表示英寸,m表示毫米,p表示打印机的点。

Tkinter控件的大小通常用宽度“width”和高度“height”表示,单位 为屏幕像素。另外,x轴间距“padx”和y轴间距“pady”,以及描述边框 宽度的高亮边框宽度“highlightthickness”和边框宽度“bordwidth”的单位也是像素。

坐标系统

kinter坐标系统的基本单位是像素,左上角像素坐标(0,0)称为 原点,坐标值为整数。在Tkinter图形显示系统中,原点在左上角,x坐标增加向右边移动,y坐标增加向底部移动。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x0QSXPci-1614432086203)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107160259573.png)]

颜色

Tkinter的颜色用字符串表示,有两种表示方法。

(1)Tkinter系统规定了一些颜色字符串,如white,black, red,green,blue,cyan,yellow,magenta等。

(2)可以用十六进制的字符串指定不同颜色,如红(R)、绿 (G)、蓝(B)三种颜色不同比例的混合色。Tkinter自定义颜色常用 字符串格式表示,其中白色用“#FFFFFF”表示、红色用“#RR0000”表示、金色用“#FFD700”表示。

Tkinter 控 件 的 颜 色 属 性 是 常 用 属 性 , 属 性 关 键 字 有activebackground , activeforeground , background ,foreground,highlightbackground,highlightcolor等。

十六进制的字符串#00至#FF表示十进制的数字0至255。我们可以用下列方法把数字转换为颜色字符串。

newcolor = '#%02x%02x%02x'%(0,255,0)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J642Bz6C-1614432086204)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107160653847.png)]

字体类型

我们会根据Python使用的操作系统平台来指定Tkinter字体类型的风格,设置字体类型的属性关键字为font。

字体类型使用元组表示,其中第一个元素是字体,其后是字体大 小,之后的字符串包含一个或多个风格修饰符。其中,bold表示加粗,normal表示正常字体宽度,italic表示斜体,roman表示正体。

例如:

label=tk.Label(root,text='字体大小',font=('Times','24','bold',bf='#1E488F'))
对齐方式

Tkinter控件的对齐方式的属性关键字为anchor。anchor取值有 N(上)、NE(右上)、E(右)、SE(右下)、S(下)、SW(左下)、W(左)、NW(左上)、CENTER(中间)等。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GUikuHCu-1614432086204)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107161011328.png)]

在程序中使用对齐方式属性时,要加上别名“tk”,如tk.W

浮雕风格(边框效果)

Tkinter控件的浮雕风格的属性关键字为relief,能够设置的取值有 RAISED,SUNKEN,FLAT,RIDGE,GROOVE,SOLID等,在使用时也要加上别名“tk”。

案例:

#tkinter边框效果relief
import tkinter as tk
root=tk.Tk()    #创建tkinter窗口对象
row=[None]*5
for bdw in range(5):
    row[bdw]=tk.Frame(root,borderwidth=0)
    tk.Label(row[bdw],text='borderwidth=%d'%bdw).pack(side=tk.LEFT)
    i = 0
    column = []
    for relief in [tk.RAISED,tk.SUNKEN,tk.FLAT,tk.RAISED,tk.GROOVE,tk.SOLID]:
        column.append(tk.Frame(row[bdw],borderwidth=bdw,relief=relief))
        tk.Label(column[i],text=relief,width=10).pack(side=tk.LEFT)
        column[i].pack(side=tk.LEFT,padx=7-bdw,pady=5+bdw)
        i  += 1
    row[bdw].pack()
root.mainloop()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iN9CuuZK-1614432086205)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107162432723.png)]

位图

在Tkinter控件中,位图选项的关键字为bitmap

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wzjmfxAe-1614432086205)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107162714725.png)]

从 左 到 右 的 字 符 串 分 别 表 示 error , gray75 ,gray50 , gray25 , gray12 , hourglass , info , questhead ,question,warning。

鼠标样式

Tkinter控件的鼠标样式是指鼠标在控件上飘过时的样式,属性关键

字为cursor。Windows系统提供的鼠标样式见图8-8。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TnkPAk96-1614432086206)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107162835084.png)]

如果把部件属性cursor设置为字符串hand2,当把鼠标移动到部件 时,鼠标形状就变为手的图形。如果设置部件属性cursor=‘heart’,则鼠标形状就变为心的形状。

图片

在Tkinter应用程序中,图片属性关键字为image。有三种获取图像文件的方法,它们支持不同的图像文件格式。

  1. 显示位图(双色)图像

显示位图(双色)图像使用.xbm文件格式,需要使用位图构造函数BitmapImage,其语法格式如下。

bmp = tk.BitmapImage(file=f[,background=b][,foreground=c])
如果要想显示一个图像标签就使用一个标签控件,其中参数
image使用BitmapImage对象图像的logo
logo = tk.BItmapImage('logo.xbm',foreground='red')
tk.Label(image=logo).grid()

其中,参数fifile的值f是.xbm图像文件的名称。图像像素占用1bit(1个二进制像素位)。在通常情况下,图像中的前景用1表示,显 示为黑色像素;背景用0表示,显示为透明的背景。如果要改变这种显示 背景的行为,就可以使用可选参数“background = b”选项设置背景颜 色b,可选参数“foreground=c”设置前景颜色c。

  1. 显示彩色图像

彩色图像的文件有.gif,.pgm和.ppm文件格式,显示彩色图像需构造函数PhotoImage,其语法格式如下。

img=tk.PhotoImage(file=f)

其中,fifile的值f是图像文件名,其可以返回在任何地方都能使用的Tkinter图像数据img。

  1. 使用python成像库

Python成像库“PIL”支持更广泛格式的图像,它是专门为在Tkinter应用程序中显示图像而设计的模块。

import tkinter as tk     #导入Tkinter模块
from PIL import Image,ImageTk
root = tk.Tk()    #创建Tkinter窗口对象
root.title(string = '图片演示')    #设置窗口标题
root.geometry('500x300')
photo=Image.open(r'E:\图片,视频\图片\严屹南.jpg')    #读入数据
img=ImageTk.PhotoImage(photo)    #转换我iTKinter图像格式
label_img=tk.Label(root,image=img)
label_img.pack()
root.mainloop()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OqQXGHpC-1614432086207)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107170207745.png)]

图 像 img 可 以 在 Tkinter 任 何 使 用 图 像 image 的 地 方 使 用 。Tk.PhotoImage()函数可以使用更多种类的图像格式文件,如常用 的.jpg图片格式文件。

3.TKinter主窗口

在使用Tkinter开发程序时,为了更好地管理Tkinter程序,首先需要使用Tk()方法建立主窗口。

一般只有执行mainloop()主循环的方法才能运行Tkinter命令的 动 作 和 创 建 Tkinter 应 用 窗 口 。 但 是 在 主 循 环 启 动 前 , 可 以 使 用update()方法执行Tkinter程序的一些操作命令,如创建窗口、建立 控件并放置在窗口中,但是执行完毕后Tkinter程序就会停止。只有mainloop()方法才会启动Tkinter消息事件循环操作,这时才会接收Tkinter的动作,如事件处理、鼠标或键盘操作处理、点击按钮操作动作等。

Tk主窗口的主要操作:

获取屏幕和窗口信息

可以用下面方法获取屏幕和窗口信息,单位是像素,窗口大小是指像素多少

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kTiKwNXO-1614432086207)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107170916151.png)]

设置窗口

设置窗口主要是改变窗口的标题、大小、位置、状态等操作

设置窗口标题

Tkinter主窗口对象“root”包含很多窗口操作的方法,如Wm类方法 和Tkinter中定义的操作方法,其中Tkinter中定义的操作方法不包含字 符“wm_”。

root.wm_title('窗口标题')    #Wm类设置窗口标题方法
root.title('窗口标题')    #Tkinter中设置窗口标题方法
设置窗口长宽和窗口的位置

Tkinter为我们提供了改变窗口大小和放置位置的操作方法。 root.geometry()方法可以根据输入的屏幕宽高、坐标来改变Tkinter窗口的位置和大小。root.geometry()方法需要以字符串的方式提供 参数,格式如root.geometry(‘300x200+150+250’),其中参数含 义为屏幕宽度为300像素、高度为200像素、x坐标为150、y坐标为250。由于参数中没有变量或其他字符,因此我们可以用字符串格式命 令“’{}x{}+{}+{}’.format(width,height, x, y)”输入整型变量参数“width,height, x, y”。

width = 300
height = 200
x,y = 150,250     #屏幕坐标
root.geometry('{}x{}+{}+{}'.format(width,height,x,y))
设置窗口的新图标

设 置 窗 口 的 新 图 标 可 以 使 用 Tkinter 的 root.iconbitmap(bitmap)方法,参数bitmap是包含路径的.ico文件名。

root.iconbitmap('tt.ico')
窗口的其他操作
  1. 设置最顶层窗口

Tkinter窗口的root.attributes(’-topmost’,1)方法可以把窗口 设置为顶层窗口,即覆盖其他窗口,总是在最顶层显示,这个属性主要针对Windows系统平台。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HTZLSIMu-1614432086208)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107172132202.png)]

  1. 设置工具栏样式窗口

Tkinter窗口的root.attributes("-toolwindow", 1)方法可以把 窗口设置为工具栏样式窗口,即窗口顶栏没有了最大化和最小化的按钮,只有关闭窗口的按钮。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T5WVlm83-1614432086209)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107172205088.png)]

  1. 隐藏窗口标题栏

Tkinter窗口的root.overrideredirect(True)方法可以隐藏窗口

标题栏,即不显示窗口标题和最大化、最小化、关闭的按钮。而

root.overrideredirect(False)方法可恢复显示窗口标题栏。

在使用中,如果隐藏了关闭按钮,也可以用Windows热键“Alt+F4”

关闭窗口。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CpyoR9Tt-1614432086210)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107172250528.png)]

  1. 窗口的最大化和最小化

Tkinter窗口的root.state(“zoomed”)方法可以使窗口最大化。

root.state(“iconic”)方法可以使窗口隐藏,只在Windows系统

程序栏显示程序图标,相当于使窗口最小化。

root.state(“normal”)方法可以使窗口还原为普通状态。

说明:Tkinter窗口的root.state()方法仅用于Windows系统。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RkQEbHdW-1614432086210)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107172315991.png)]

  1. 设置全屏窗口

Tkinter窗口的root.attributes("-fullscreen", True)方法可以 把窗口设置为全屏窗口。在全屏状态下,可以用Windows热键“Alt+F4”关闭窗口。

root.attributes("-fullscreen", False)方法可以取消全屏窗口,还原为普通窗口。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YHqrVD2U-1614432086211)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107172357196.png)]

  1. 设置窗口透明度

Tkinter窗口的root.attributes("-alpha",n)方法可以设置窗口的透明度。透明度参数n是从0到1的小数,1是不透明,0是全透明。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FoZz4ne4-1614432086212)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107172419487.png)]

4.Toplevel顶层子窗口

Tkinter运行后出现一个主窗口,或称根窗口。如果要继续创建一些子窗口,就可以使用tk.Toplevel()方法。

Toplevel子窗口与Tk根窗口相比,除了Toplevel子窗口无Tkinter系 统控制权外,拥有的属性和方法基本都是一样的,如修改窗口标题、建立菜单、改变窗口大小、移动位置、放置控件等操作。

演示创建一个子窗口。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OwEbZ2xC-1614432086212)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107172542992.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZV5BEzyo-1614432086213)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107172549058.png)]

5.创建窗口菜单栏

Tkinter的菜单Menu能用于根窗口和子窗口中

使用过程
创建主菜单条
import tkinter as tk
root = tk.Tk()
mainmenu = tk.Menu(root)    #创建主菜单
建立子菜单
filemenu = tk.Menu(mainmenu,tearoff=False)    #建立子菜单filemenu,tearoff=False 不显示分隔虚线
helpmenu = tk.Menu(mainmenu,tearoff=True)    #建立子菜单helpmenu

把子菜单加入到主菜单中
mainmenu.add_cascade(label='菜单',menu=filemenu)
mainmenu.add_cascade(label='帮助',menu=helpmenu)
建立子菜单项目
filemenu.add_command(label='读取',command=hello)    #增加filemenu的菜单项目
filemenu.add_command(label='保存',command=hello)
filemenu.add_separator()    #增加filemenu的分割线
filemenu.add_command(label='另存',command=hello)
filemenu.add_command(label='查看',command=hello)
给窗口哦配置菜单
root.config(menu=mainmenu)    #给根窗口配置菜单条

案例:

import tkinter as tk     #导入Tkinter模块
def hello():
    print('hello')
root = tk.Tk()    #创建Tkinter窗口对象
root.title(string = '菜单演示')    #设置窗口标题
root.geometry('300x200')
mainmenu = tk.Menu(root)    #创建主菜单
filemenu = tk.Menu(mainmenu,tearoff=False)    #建立子菜单filemenu,tearoff=False 不显示分隔虚线
helpmenu = tk.Menu(mainmenu,tearoff=True)    #建立子菜单helpmenu
mainmenu.add_cascade(label='菜单',menu=filemenu)
mainmenu.add_cascade(label='帮助',menu=helpmenu)
filemenu.add_command(label='读取',command=hello)    #增加filemenu的菜单项目
filemenu.add_command(label='保存',command=hello)
filemenu.add_separator()    #增加filemenu的分割线
filemenu.add_command(label='另存',command=hello)
filemenu.add_command(label='查看',command=hello)
root.config(menu=mainmenu)    #给根窗口配置菜单条
root.mainloop()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ooK9Oqth-1614432086214)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107184906220.png)]

6.创建弹出菜单

Tkinter的弹出菜单能用于很多Thinter控件上。弹出菜单和窗口主

菜单的创建过程相似,只是配置菜单的方式不同。

弹出菜单的使用过程:
创建弹出主菜单条
import tkinter as tk
root = tk.Tk()
menu=tk.Menu(root,tearoff=True)
建立子菜单

如果有多级弹出菜单,就需要创建弹出子菜单

filemenu = tk.Menu(menu,tearoff=False)    #建立弹出子菜单filemenu
建立子菜单项目,把弹出二级子菜单放到所需的位置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HHG14ZBH-1614432086215)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107190635843.png)]

创建弹出菜单操作函数
def popup(event):    #弹出菜单操作函数
	menu.post(event.x_root,event.y_root)
把弹出菜单绑定到所需的控件上
frame.bind('<Button-3>',popup)    #把弹出菜单绑定到所需的控件上

弹出菜单能够绑定到很多Tkinter控件上,特别是Text,TreeView等,合理使用弹出菜单能够提高用户对软件操作的快捷性。

案例:

import tkinter as tk     #导入Tkinter模块
def hello():
    print('hello')
root = tk.Tk()    #创建Tkinter窗口对象
root.title(string = '菜单演示')    #设置窗口标题
root.geometry('300x200')
menu = tk.Menu(root,tearoff=True)    #创建主菜单
filemenu = tk.Menu(menu,tearoff=False)    #建立子菜单filemenu,tearoff=False 不显示分隔虚线
menu.add_command(label='菜单1',command=hello)
menu.add_command(label='菜单2',command=hello)
menu.add_command(label='菜单3',command=hello)
menu.add_command(label='菜单4',command=hello)
filemenu.add_separator()    #增加filemenu的分割线
menu.add_cascade(label='菜单',menu=filemenu)
filemenu.add_command(label='读取',command=hello)    #增加filemenu的菜单项目
filemenu.add_command(label='保存',command=hello)
filemenu.add_separator()    #增加filemenu的分割线
filemenu.add_command(label='另存',command=hello)
filemenu.add_command(label='查看',command=hello)
frame = tk.Frame(root,width=512,height=512)
frame.pack()
def popup(event):    #弹出菜单操作函数
	menu.post(event.x_root,event.y_root)

frame.bind('<Button-3>',popup)    #把弹出菜单绑定到所需的控件上
root.mainloop()

7.控件的几何布局管理方法

Tkinter控件共有三种几何布局管理器,分别是Pack布局、Grid布 局和Place布局,通过几何布局管理器可以控制窗体或容器中各个控件的位置关系。

Pack布局

在使用 pack()方法时,默认先使用的放到上面,然后依次向下

排,其会给控件一个自认为合适的位置和大小,这是默认方式。

pack()方法不能和grid()方法混用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1f9VOe8c-1614432086216)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107195531812.png)]

pack方法属性关键字

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WhFO56Fd-1614432086217)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107195657411.png)]

在Tkinter中,pack_forget()方法和forget()方法用于删除pack()方法的控件显示,但仅仅是控件不显示了,旧的显示位置也会 消除,而控件对象没有删除。如果需要再显示控件,就可以在新位置用pack()方法。

pack_info()方法用于显示pack()方法的设置信息,并返回有 关pack()方法中参数的一个字典数据。

pack_confifigure()方法用于配置pack()方法的控件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rgxubvcx-1614432086217)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107195739459.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sqaQ9QJR-1614432086218)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107195749641.png)]

Grid布局

控件的Grid布局是网格布局,是使用行列位置的坐标来放置控件的 几何布局管理器,其使用 grid()方法。grid()方法布局管理器会将 控件放置到一个虚拟的二维表格里,主控件被分割成一系列的行和列,表格中的每个单元都可以放置一个控件。

如果使用Pack进行布局,可能还需要一些额外的Frame控件,并需 要自行调整。而如果你使用Grid进行布局,只需要对每个控件使用grid()方法,那么所有的控件就都会以合适的方式显示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9fZ4lgD5-1614432086219)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107200426393.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EBCr5lD7-1614432086220)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107200435422.png)]

在使用grid()方法时,至少要给出两个参数,即用row表示行、用column表示列,它们的编号都从0开始。

grid()方法的另一个参数sticky,可以用“N”“E”“S”“W”表示上右下左,它决定了控件开始的方向。

grid_forget()方法用于删除 grid()方法的控件显示,但仅仅是

控件不显示了,旧位置也会消除,而控件对象没有删除。如果想显示控件,就可以在新位置用 grid()方法。

grid_info()方法用于显示grid()方法的设置信息,返回关于grid()方法中参数关键字的一个字典数据。grid _confifigure()方法用于配置grid()方法的控件。

案例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vhhNcCrZ-1614432086221)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107200551233.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WpA2qw0C-1614432086222)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107200608933.png)]

Place布局

Place布局管理器可以显示指定控件的绝对位置或相对于其他控件的 位置。如果想要使用Place布局,只需调用相应控件的place()方法就可以了,所有Tkinter 的标准控件都可以调用place()方法。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T2LOWEkN-1614432086222)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107200631883.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hztL9KHo-1614432086223)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107200641540.png)]

Place布局分为绝对布局和相对布局,绝对布局使用x和y参数关键字,相对布局使用relx,rely,relheight和relwidth参数关键字。

如果窗口大小是固定的,就可以使用place()方法的绝对布局方式,否则窗口大小改变后就不好看了。

由于place()方法可以与pack()方法和grid()方法混用,因此使用palce()方法布局的控件可以叠加。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6CcXNp7s-1614432086224)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107200749341.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FHIrEHJq-1614432086225)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107200753821.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IZMHbG9F-1614432086225)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107200758384.png)]

8 Tkinter常用控件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-poAQWdvU-1614432086226)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107201223328.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AI3pgFNK-1614432086227)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201107201231318.png)]

除了表格中列出的控件外,Tkinter的控件还包含一些对话框模块,

如messagebox,fifiledialog,simpledialog,colorchooser等。

messagebox:为简单的任务提供七种常见的弹出式对话框。

fifiledialog:允许用户浏览文件。

colorchooser:允许用户选择颜色。

simpledialog:允许用户输入整型数、浮点数、字符串的对话框。

1.Label控件

Label控件是Tkinter最常用的控件之一,其语法格式如下

label = tk.Label(master,option,...)

其中,master为其父控件,就是用来放置这个控件的。

option是属性关键字,其可以在控件创建时设置属性,也可以在创

建控件后再为其指定属性,因此在创建方法中的option选项参数可以为空。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1xJbUWRF-1614432086227)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109171717786.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oAGf7rnq-1614432086228)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109171749548.png)]

Tkinter容器控件没有背景图片属性,通常都是利用Label图片属性

来给容器控件增加背景图片。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YB4k2yQp-1614432086228)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109171816197.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LPQ5CUnV-1614432086229)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109171825136.png)]

2.Frame控件

Frame控件是Tkinter的容器控件,负责安排其他控件的位置。 Frame控件采用在屏幕上的矩形区域组织布局,并提供其他控件和容器 控件本身的填充。一个Frame控件也可以用来作为一个基础类,以实现复杂的构件。

窗口画面布局过程:

首先,建立布局,即主窗口布局。用不同颜色和大小的Frame类进行填充,调整位置直到自己满意。

其次,设计不同功能的子窗口,就是Frame类放在Frame中,如Label,Button等,并调整好控件的大小和位置。

最后,根据需要可以程序控制不同功能的Frame类显示或隐藏到对应的主窗口布局中。

Frame语法格式:

frame = tk.Frame(master,option.,,.)

master为父窗口,option是控件的属性选项关键字列表。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-thKWqcvu-1614432086230)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109172146064.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-occyHYcJ-1614432086230)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109172933624.png)]

import tkinter as tk
root=tk.Tk()
root.title('Frame演示')
labels=[]
reliefs = [tk.FLAT,tk.SUNKEN,tk.RAISED,tk.GROOVE,tk.RIDGE]
i = 0
for color in ['blue','yellow','red','purple','pink']:
    f = tk.Frame(root,borderwidth=1,bg=color,relief=reliefs[i],bd=20,width=100,height=100,container=True)
    f.pack(side=tk.LEFT)
    i  += 1
root.mainloop()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qx32DStk-1614432086231)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109172922590.png)]

3.Button控件

Button控件是一个标准的Tkinter控件,用于实现各种包含文本和图像的按钮。可以调用Python的函数用于每个按钮,在Tkinter的按钮被 按下时,就会自动调用该函数。该按钮可以只显示在一个单一字体的文 本中,但文本可能跨越一个以上的行。此外,一个字符可以有下画线, 如标记的键盘快捷键。在默认情况下,使用Tab键可以移动到另一个按钮控件。Button按钮方法支持flflash()方法和invoke()方法。

Button按钮通常用于应用程序窗口接受鼠标点击并执行相应的程序。

其语法格式如下:

button = tk.Button(master ,option=value,..)

master为父窗口,option是控件的属性关键字选项列表。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sjuph6RB-1614432086232)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109173109535.png)]

下面主要介绍一下Button控件特有属性的用法:

command属性指定按钮消息的回调函数,即鼠标左键按下后,Button按钮执行command属性指定的回调函数或方法。

state属性指定按钮的状态。如果state的值为DISABLED,那么Button控件就是处于不可用状态,即按钮无法点击,也不会执行command属性指定的回调函数或方法。

提示:针对Button控件command参数的回调函数,如果函数不带 参 数 , 就 直 接 使 用 函 数 名 ; 如 果 函 数 带 参 数 , 就 需 要 使 “lambda:function(参数表)”的格式。

与Label控件不同,Button控件除了有属性以外,还有一些方法。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d2BNXNvR-1614432086232)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109173407158.png)]

flflash()方法可以使某个按钮快速在普通和激活状态下闪烁几次。invoke()方法可以在程序中模拟当某个按钮被按下时所执行的回调函数。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V3dRN67h-1614432086233)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109173515878.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iVdKQWG2-1614432086234)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109173507175.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GolYxp2n-1614432086235)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109173525830.png)]

4.Entry 控件

Entry控件是Tkinter的文本框,是Tkinter用来接收字符串等输入的 控件。该控件允许用户查看和修改一行文本,但是当用户输入的文字长度大于Entry控件的宽度时,文字就会向后滚动。这种情况下所输入的字 符串就无法全部显示,可以点击箭头符号将不可见的文字部分移入到可 见区域。如果你想要输入多行文本,就需要使用Text控件。另外,Entry控件只能使用预设字体。

使用Entry控件的语法如下:

entry = tk.Entry(master,option,...)

master为父窗口,option是控件的属性关键字选项列表。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bSJbxP4s-1614432086235)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109173802288.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PyEYWoRr-1614432086236)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109173817163.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jzjqndc9-1614432086237)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109173855247.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KqwM2y9e-1614432086238)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109173903050.png)]

5.Text控件

Text控件是Tkinter的多行文本编辑框,其十分强大且具有很强的灵 活性,适用于多种任务。虽说Text的主要作用是显示多行文本,但也常常被当作简单的文本处理器、文本编辑器来使用。

使用Text文本控件的语法如下:

text = tk.Text(master,option,...)

master为父控件,option是控件的属性关键字选项列表。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ccIM9ndu-1614432086239)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109175340417.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q4f0MYlN-1614432086239)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109175353338.png)]

Text控件插入

为了给Text控件插入内容,可以使用insert()方法及“INSERT”或“END”索引号,也可以按行列索引插入,格式为“行号.列号”。注意,行号从1开始,列号从0开始。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Akfd7Nl9-1614432086240)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109180023029.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sGvTv3BR-1614432086241)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109180027765.png)]

清除Text控件的内容

清除Text控件的所有内容的格式如下:

Text1.delete(1.0,tk.END)
获取Text控件的内容

获取Text控件的所有内容的格式如下:

T1 =Text1.get(1.0,tk.END)
在Text控件中插入图片

在Text控件中插入图片的格式如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XMHOicPs-1614432086242)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109180322697.png)]

在Text控件中插入Button按钮

在Text控件中插入Button按钮的格式如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eaUw9OGA-1614432086242)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109180454249.png)]

Text 控件的Tags用法

标签“Tags”通常用于改变Text控件中内容的样式和功能,即可修改 文本的字体、尺寸和颜色。另外,Tags还可将文本、嵌入的控件、图片与鼠标和键盘等事件相关联。

Tags可以自定义任意数量的、其名字由普通字符串组成的,除了空 白字符以外的任何字符。另外,任何文本内容都支持多个Tags描述,且任何Tags也可以用于描述多个不同的文本内容。

为指定文本添加Tags可以使用tag_add()方法,设置Tags的样式 可以使用tag_confifig()方法。下面是tag_confifig()方法可以使用的选项

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mSqrnm66-1614432086243)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109180650478.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yMtbGtBq-1614432086244)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109180712864.png)]

如果同一个范围内的文本加上多个Tags(会形成一个栈的形式),

并且设置相同的选项,那么新建的Tags样式就会覆盖旧的Tags。

另外,Tags还支持事件绑定,使用的是tag_bind()方法。

tag_add()方法的参数通常有四个,具体如下:

第一个参数为自定义标签的名字。

第二个参数为设置的起始位置。

第三个参数为结束位置。

第四个参数为另一个位置。

下边的例子中,我们将文本Baidu.com与鼠标事件进行绑定。当鼠 标进入该文本段时,鼠标样式切换为arrow形态;当鼠标离开文本段时, 则切换回xterm形态。当触发鼠标“左键点击操作”时,使用默认浏览器打开百度首页。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VTefSI0N-1614432086244)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109180808020.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j5UIISRD-1614432086245)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109180814303.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-skqWxmNC-1614432086246)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109180825890.png)]

scrollbar控件

Tkinter的Scrollbar滚动条控件用于滚动一些控件的可见范围。Scrollbar控件通常与Text控件、Canvas控件、Listbox 控件一起使 用,水平滚动条还能与Entry控件配合,通过滚动条滑动窗口可以进入更大的虚拟空间。说明:根据方向不同,Scrollbar控件可分为垂直滚动条和水平滚动 条。具有上下和左右两个方向滚动功能的控件,如Canvas控件和Text部件,有水平和垂直两种滚动条。使用Scrollbar滚动条控件的语法如下:

scrollbar=tk.Scrollbar(master,option,...)

master为父控件,option是控件的属性关键字选项列表。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9K0PO9uc-1614432086246)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109181517188.png)]

在某个控件上安装垂直滚动条的做法:

(1)设置该控件的“yscrollbar”的“command”选项为Scrollbar控件的set()方法。

( 2 ) 设 置 Scrollbar 控 件 的 “command” 选 项 为 该 控 件 的yview()方法。

当控件的可视范围发生改变时,控件通过调用set()方法通知Scrollbar控件,而当用户操纵滚动条时,将自动调用控件的yview()方法。

添 加 水 平 滚 动 条 只 需 要 将 yscrollcommand 改 为xscrollcommand,yview改为xview即可。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BTxCr8AQ-1614432086247)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109181735070.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ojaJWTcX-1614432086247)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109181748250.png)]

Canvas控件

Canvas是Tkinter的画布控件,通常用于显示和编辑图形,即绘制线段、圆形、多边形,甚至是其他控件。

Canvas控件的语法格式如下:

w = Canvas (master,option=value,...)

master为父控件,option是控件的属性关键字选项列表。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ccvH4C8K-1614432086248)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109181946178.png)]

canvas控件支持画图对象及说明:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CVik790z-1614432086249)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109182120742.png)]

其中,弦、扇形、椭圆形、圆形、多边形和矩形这些“封闭式”图形都是由轮廓线和填充颜色组成的,但都可以设置为透明。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4weOEEEs-1614432086249)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109182207329.png)]

下面创建一个可在Canvas上手动绘图的应用,但Canvas并未提供 画单个点的方法。我们可以通过绘制小的oval图形来解决这个问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VqjBBncN-1614432086250)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109182310815.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sY7QE7L5-1614432086251)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109182344278.png)]

工具条和状态栏

由于Tkinter没有工具条的控件,因此可用Frame来代替工具条的布

局。工具条的设计过程如下:

(1)建立一个Frame。

(2)在Frame中放置几个Buttom,靠左顺序排放。

(3)把设计好的Frame放置到窗口的最顶端,且在x轴方向填充。

Tkinter也没有状态栏控件,可用Frame来建立状态栏,设计原理同

工具条。这里给出了状态栏StatusBar的类,读者可以直接使用。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1C41DkQ6-1614432086251)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109183314715.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BtU57Kfm-1614432086252)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109183329026.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aIT1lqHL-1614432086252)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109183342853.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-72aI7PLX-1614432086253)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201109183350786.png)]

9 Tkinter的事件和绑定

事件是发生在应用程序上的事情,多数情况是对用户按键和鼠标操

作做出的反应,包括用户间接引起的事件(如控件状态改变)和程序

上、系统上的自动事件(如定时器事件)。

Tkinter应用程序将大部分时间花在通过 mainloop()方法启动的

事件循环中。Tkinter提供了一种强大的事件处理机制,既可以自己处理

事件也可以将Python的函数和方法绑定到事件上。

Tkinter控件通常有很多内置的行为。例如,按钮通过调用回调命令

对鼠标单击做出反应。Tkinter的事件绑定功能允许添加、更改或删除新

的事件处理能力。例如,前面出现的w.bind( “”,

paint )代码给控件“w”绑定鼠标左键按下处理程序。

Tkinter的应用程序需要知道发生的一些事件才能进行事件处理。事

件处理程序是在事件发生时应用程序调用的函数。当应用程序设置事件

处理程序时,我们将其称为绑定在一个部件上。

事件绑定有三种方式:

(1)通过“command = 回调函数”,连接事件,按钮级别。例 如 , b1=tk.Button ( root , text=“button” ,command=hello2)。

(2)通过bind()方法绑定事件,控件级别。例如,w.bind( “”, paint )。第一个参数是事件名称,第二个参数是事件回调函数。

(3)通过protocol()方法来绑定系统级别事件。例如,可以安装 其 他 协 议 的 处 理 程 序 , 如 WM_TAKE_FOCUS 和WM_SAVE_YOURSELF。例如,root.protocol(“WM_DELETE_WINDOW”,callback)。

时间名称

一般来说,事件名称是包含一个或多个事件模式的字符串,而每个 事件模式都描述了可能发生的一件事。如果序列中有多个事件模式,则只有当所有模式都发生在同一序列中时才会调用处理程序。

事件名称的一般形式:

<[modifier-]...type[-datail]>

整个模式都包含在<…>内,其中参数的含义如下。

type:描述普通的事件类型,比如鼠标的单击或者键盘的单击。

modififier:修饰项,可选,通常用于描述组合键。

detail:事件名称,可选,用于描述具体的按键。

事件类型描述了事件的一般类型,如按键或鼠标单击。

在类型之前可以添加可选的修饰项以指定组合,如在其他键按下或 鼠标点击时还可以添加可选的细节项来描述正在寻找的键或鼠标按钮。 对于鼠标按钮,1为按钮1,2为按钮2,3为按钮3。通常的鼠标设置为左边有按钮1,右边有按钮3,左撇子可以交换位置。对于键盘上的键,要么是键盘的字符(关于单字符键,如“a”或“*”键),要么是按键的名称.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JEeuCMQV-1614432086254)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201111185725613.png)]

事件类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MXmvMZ9v-1614432086255)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201111190756404.png)]

事件修饰符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ymATfrk-1614432086255)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201111191024546.png)]

可以使用短格式的事件形式:

<1>等同于,表示用户单击鼠标左键。

等同于,表示用户按下H键。

注意

在<…>短格式中,对于单字符按键不能使用和<<>等。

编写事件处理程序

处理程序被传递给一个事件对象“Event”,该对象描述发生了什么。处理程序可以是函数,也可以是方法。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QdLGqJrq-1614432086256)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201111191743742.png)]

Tkinter事件传递给处理程序的事件对象的属性下面属性中,有些总是被设置的,有些只是为特定类型的事件设置的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mNl57jup-1614432086257)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201111191931778.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k3jkQjZJ-1614432086258)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201111192255920.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ArX32cvo-1614432086258)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201111192947772.png)]

如何将鼠标按钮在一块名为“w”的画布上画点,其中paint()就是事件处理程序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pWNq0Cnm-1614432086259)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201111193231178.png)]

在调用此处理程序时,当前鼠标的位置为(event.x, event.y)。在利用 w.create_oval()方法绘制一个圆形时,以该位置为中心。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vqAW5rHV-1614432086260)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201111193253353.png)]

10 Ttk控件

Tkinter的主题控件Ttx是Python新版本中的标准库,无需再安装。

Tkinter一直是Python的一个组成部分,它提供了一种与平台无关 的窗口工具包。早期由于Tkinter包的功能有限,程序员做出的窗口界面单调古板,后来就推出了 tkinter.ttk库(Tk主题控件)。

Tk主题控件带有17个小控件,其中11个已经存在于Tkinter中,即Button , Checkbutton , Entry , Frame , Label , LabelFrame ,Menubutton,PanedWindow,Radiobutton,Scale和Scrollbar,6 个 新 的 窗 口 小 控 件 是 Combobox , Notebook , Progressbar ,Separator,Sizegrip和Treeview。

Ttk的用法与Tkinter基本相同,但是Ttk不再支持有一些属性,如Tkinter中的“fg”和“bg”,它是通过style对象进行支持的。

例如,改变字体:

ttk.Style().configure(".",font=(‘仿宋’,25)

tkinter.ttk库是Tkinter库的一部分,其能够增强Tkinter的界面设

计。

  • tkinter.ttk库的引入方式:
import tkinter as tk    #装载tkinter,用于Python3
import tkinter.ttk as ttk    #导入Tkinter.ttk,用于Python3

一个Tkinter和Ttk混合编写的示例

#ttk使用
import tkinter as tk
import tkinter.ttk as ttk
root = tk.Tk()
root.title(string = '主窗口标题')
frame = tk.Frame(root,width=200,height=100,bg="#ACACAC")

frame.pack()
frame2 = ttk.LabelFrame(root,text="选项",width=200,height=100)
frame2.pack()
root.mainloop()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hEDnUICd-1614432086261)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201111201127976.png)]

ttk.Notebook控件

ttk.Notebook控件类似于Frame控件,即通过点击顶部标签的选项卡选择不同的容器。

构造函数:

w=ttk.Notebook(parent,option=value, ...)

其中,parent为父容器,option的属性关键字

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VpKIaNzD-1614432086262)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201111201928642.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KzGllMMF-1614432086262)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201111202446087.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2brKU8DN-1614432086263)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201111202541346.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HK7nbFT3-1614432086264)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201111202936489.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G3BQDVwj-1614432086265)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201111202949185.png)]

ttk.Treeview控件

ttk.Treeview控件可以做到树型结构显示,也可以当做表格来使用,其支持水平滚动何垂直滚动

构造函数:

w = ttk.Treeview(parent,option=value, ...)

parent为父容器,option的属性关键字

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-llSALCOt-1614432086265)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201111203145466.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IbwkJrso-1614432086266)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201111203403935.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t17H4Mpz-1614432086267)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201111203435294.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7XBkH1kd-1614432086267)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201111203447896.png)]

Treeview.focus()方法和Treeview.selection()方法可以作用

于要变化的项目。

treeview的方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JBmICjiF-1614432086268)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201111203623988.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QYXscNRL-1614432086269)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201111203802513.png)]

案例:

import tkinter as tk
import tkinter.ttk as ttk
root = tk.Tk()
root.title(string = 'ttk.Treeview演示')
root.geometry('600x500+200+200')
tree=ttk.Treeview(root,height=9)
myid=tree.insert('',0,'指标',text='指标',values=('1'),open=True)    #''表示父节点事根
myidx1 = tree.insert(myid,0,'技术指标',text="技术指标",values=('2'))    #text表示显示出的文本,value是隐藏的值
myidx2 = tree.insert(myid,1,'交易系统',text="交易系统",values=('3'))
myidx3 = tree.insert(myid,2,'条件选股',text="条件选股",values=('4'))
myidx4 = tree.insert(myid,3,'五彩k线',text="五彩k线",values=('5'))
myidxy = tree.insert('',1,'工具',text="工具",values=('6'),open=True)
myidxy1 = tree.insert(myid,0,'系统设置',text="系统设置",values=('7'))
myidxy2= tree.insert(myid,0,'指标排序',text="指标排序",values=('8'))
tree.pack(fill=tk.X)
tree.selection_set("指标")
tree2 = ttk.Treeview(root,columns=('col1','col2','col3'),show='headings')
tree2.column('col1',width=100, anchor='center')
tree2.column('col2',width=100, anchor='center')
tree2.column('col3',width=100, anchor='center')
tree2.heading('col1',text='股票代码')
tree2.heading('col2',text='日期')
tree2.heading('col3',text='时间')
def onDBClinck(event):
    item = tree2.selection()[0]
    print('you clicked on',tree2.item(item,'values'))
for i in range(10):
    tree2.insert('',i,values=('6000'+str(i),'2019年9月3日','9:31'))
tree2.bind('<Double-1>',onDBClinck)
tree2.pack(fill=tk.X)
root.mainloop()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IWUPvaLI-1614432086269)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201112150806480.png)]

11 Tix控件

Tkinter的扩展控件Tix是Python新版本中的标准库,无需再安装。

Tix 库 提 供 了 标 准 Tk 库 缺 失 的 常 用 小 控 件 , 如 HList 控 件 、ComboBox控件、Control控件和各种可滚动的小控件。由于标准的Tk控件过于原始,因此借助Tix超级控件可以设计出更加美观的应用程序。tkinter.tix包括40多个控件。

我们使用这些新的控件可以在应用程序中引入新的交互技术,创建 更有用和更直观的用户界面,还可以通过选择最合适的控件来设计应用程序,以满足应用程序和用户的特殊需求。

TIx的使用

在Python 3中,Tix已被重命名为tkinter.tix

**Ttk是建立在Tkinter基础上的,因此除了Tkinter的基本控件外,我们还可以在程序中灵活使用Ttk所提供的控件。**Ttk的控件完全可以适用在Tkinter的窗口和容器中,而Tkinter.Tk()方法的实例对象“root”管理整个Tkinter和Ttk控件的运行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w9RH8Bcu-1614432086270)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201112151457475.png)]

但是在Tix模块类中,将Tkinter模块中的类子类化,因此Tix是建立 在Tkinter模块基础上的,故Tkinter.Tk()方法的实例对象“root”无法管理Tix控件。

由于Tix模块中的Tix.Tk()类继承于tkinter.Tk类,因此,它除了能管理Tix控件外,还能管理Tkinter控件和Ttk控件。

要将Tix控件和Tkinter控件一起使用,只需要导入一个模块即 可。一般情况下,可以只导入Tix,用Tix.Tk()替换Tkinter.Tk()的 顶 层 调 用 并 负 责 管 理 Tix 和 Tkinter 控 件 的 运 行 。 因 此 , 需 要 用 Tix.Tk()方法的实例对象“root”管理Tix控件、Tkinter控件和Ttk控件的运行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4ED4wbAQ-1614432086271)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201112153731115.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-syWa42wr-1614432086271)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201112152043864.png)]

在程序段中用root= tix.Tk()替代root=tk.Tk(),其他内容不用改变,其运行结果相同。

Tix控件与Ttk控件一样,对于外观属性,如字体等不再使用Tkinter的属性关键字font来设置。Tix控件使用属性options通过字符串来设置。

外观属性options的字符串描述格式为“控件.属性 参数值…”。

例如,options=‘listbox.height 4 label.padY 5 label.width 10label.anchor ne’。

From表格集合管理器

Tix提供了新的表格几何管理器——Form,该管理器适用于所有的Tkinter控件布局的规则。

Form表格几何管理器用法如下:

w.form(top=0,left=0,right=0,bottom=None)

在父容器控件中放置(显示)控件w,其四边大小和位置由参数控 制。其中,top和left相当于控件“w”在父控件的相对坐标(x,y),单位是像素。

当right和bottom的值为None时,控件w为自动宽度。

当right和bottom的值为-1时,控件w的右边到父控件的右边框,或者控件w的下边到父控件的下边框。

当top,left,right和bottom为正整数时,表示父控件的绝对坐标。

当top,left,right和bottom使用“%n”格式的字符串时,表示父控 件的相对坐标。例如,left="%60"表示w左边的相对位置坐标在父容器控件宽度的60%位置。

在top,left,right,bottom中,其中一个可以是其他使用Form布局的控件w2。例如,top=w2表示w的top等于w2的bottom。

w.forget()方法可以删除掉控件w的显示,但控件w对象还存在。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-utojrg1R-1614432086272)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201112153401496.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XvHbTIJB-1614432086273)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201112153412768.png)]

从上面程序代码和运行结果中可知,使用tix.Tk()方法建立主窗口 后,使得Tkinter控件、Ttk控件和Tix的控件都具有了Form方法。Form 方法类似于Place方法,但是使用Form方法的控件都具有了控件的“锚 定”特性,这可以成为其他控件布局定位的参考。

tix.Balloon气球窗口控件

tix.Balloon气球窗口控件可以为其他控件提供帮助。当用户将光标 移动到已绑定了该控件的窗口控件中时,屏幕上就会显示一个带有描述性消息的小型弹出式窗口。

使用tix.Balloon气球窗口控件的构造语法如下:

balloon = tix.Balloon(master,statusbar=None,options='')

master为父控件。statusbar是此控件绑定的状态条控件。options用于配置控件。

上面的属性外,tix.Balloon控件还有一些方法可以使用。

  • .bind_widget()方法绑定控件的格式如下:
balloon.bind_widget(widget,balloonmsg='',statusmsg=None)

widget是要绑定的控件,也就是说在鼠标移动到控件上方时会出现需要提示的信息。

balloonmsg是需要提示的信息。

statusmsg是需要在状态栏显示的信息。

  • .unbind_widget()方法解绑控件的格式如下:
balloon.unbind_widget(widget)

widget是要解绑的控件。

案例:

import tkinter.tix as tix
from tkinter.constants import *
TCL_ALL_EVENTS = 0
def RunSample(root):
    balloon = DemoBallon(root)
    balloon.mainloop()
    balloon.destroy()
class DemoBallon:
    def __init__(self,w):
        self.root = w
        self.exit = -1
        z = w.winfo_toplevel()
        z.wm_protocol('WM_DELFETE_WINDOW',lambda self=self:self.quitcmd())
        z.title('Tix.Ballon演示')    #在Tkinter中设置窗口标题方法
        status = tix.Label(w,width=40,relief=tix.SUNKEN,bd=1)
        status.pack(side=tix.BOTTOM,fill=tix.Y,padx=2,pady=1)
        #建立连个Tix按钮
        button1 = tix.Button(w,text='关闭窗口',command=self.quitcmd)
        button2 = tix.Button(w,text='按钮自毁')
        button2['command'] = lambda w=button2:w.destroy()
        button1.pack(side=tix.TOP,expand=1)
        button2.pack(side=tix.TOP,expand=1)
        #建立tixballoon
        b = tix.Balloon(w,statusbar=status)
        b.bind_widget(button1,balloonmsg='关闭这个窗口',statusmsg='按下这个按钮,关闭窗口')
        b.bind_widget(button2,balloonmsg='删除这个按钮',statusmsg='按下这个按钮,删除这个按钮')

    def quitcmd(self):
        self.exit = 0
    def mainloop(self):
        foundEvent =1
        while self.exit < 0 and foundEvent >0 :
            foundEvent = self.root.tk.dooneevent(TCL_ALL_EVENTS)
    def destroy(self):
        self.root.destroy()
if __name__=='__main__':
    root = tix.Tk()
    RunSample(root)
tix.ButtonBox按钮框控件

tix.ButtonBox按钮框中可以添加一些按钮,如通常用的“Ok”和 “Cancel”等。

按钮框中添加的所有按钮的宽度值要相同,另外按钮提示文本、下画线、命令和宽度选项都是tix.Button按钮控件的标准选项。

tix.ButtonBox控件的构造语法如下:

btnbox = tix.ButtonBox (master,orientation = HORIZONTAL)

master为父控件。orientation是控件排列按钮的方向,默认水平为HORIZONTAL。

tix.ButtonBox控件还有一些方法可以使用

  • .add()方法增加按钮语法如下:

    btnbox.add(name,option=value, ...)
    

    name是按钮的名称。option是Tix.Button按钮控件的一些属性参数,如text,underline,width,command等。

  • .invoke()方法调用按钮的command回调程序,其语法如下:

    btnbox.invoke(name)
    

    name是tix.ButtonBox控件铁甲的按钮名称,

调用名字为“name”按钮的“command”回调函数或方法,并返回该函数返回的内容,这类似于程序模拟按钮动作。如果按钮被禁用或没有回调,则无效。

不 像 tk.messagebox 中 的 一 些 控 件 那 样 会 返 回 参 数 值 ,tix.ButtonBox只能使用cammand参数写回调函数。不过,使用Tix并不会影响我们对Tkinter原始控件的使用。

一个有关tix.ButtonBox控件的演示程序。当点击“Quit”按钮时,会弹出一个“tk.messagebox”对话框,再确认一次退出操作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B9LPFkrL-1614432086273)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201112170015600.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Qs7ZnxE-1614432086274)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201112170035894.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SAlX7nkQ-1614432086274)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201112170048070.png)]

tix.ComboBox 组合框控件

tix.ComboBox 组合框控件类似于MS Windows中的组合框控件,用户可以通过键入条目子组件或从列表框子选择组件中来选择一个选项。

tix.ComboBox控件的构造语法如下:

cbox = tix.ComboBox(master,label,dropdown=1,editable=0,command=None,fancy=0,variable=None,options='')

master为父部件。

label是要显示的标签。

dropdown表示是否允许下拉,默认为1是允许下拉菜单方式显示。

editable表示是否允许编辑,默认为0是不允许编辑。

command为设置回调函数。

variable为设置一个变量。

fancy为在可编辑状态下设置一个删除和选择按钮,默认为0。

options为设置控件的外观式样等。

tix.ComboBox组合框控件还有一些方法可以使用。

  • .insert()为插入字符串,语法如下:
cbox.insert(index,str)

,index是索引,如最后位置为tix.END。str是插入的字符串。

  • .pick()方法显示index位置的字符串,语法如下:
cbox.pick(index)

此方法使显示的第一个值为index索引的字符串。

  • .add_history()方法在最前面增加字符串,语法如下:
cbox.add_history(str)

把参数’str’字符串插入到选择值列表的最前面。

  • .append_history()方法在最后面增加字符串,语法如下:
cbox.append_history(str)

把参数“str”字符串插入到选择值列表的最后面。

  • .set_silent()方法设置默认值,语法如下:
cbox.set_silent(str)

把参数“str”设置为默认值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FNgH79TX-1614432086275)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201112172105545.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bGTIxWzj-1614432086275)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201112172139674.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KAmODHKv-1614432086276)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201112172147230.png)]

tix.Control控制窗口控件

tix.Control控制窗口控件也被称为SpinBox窗口控件,用户可以通 过按上下两个箭头按钮或直接输入数值来调整数值。新值将根据用户定义的上限和下限进行检查。

tix.Control控制窗口控件的构造语法如下:

spinbox = tix.Control (master,laabel,integer=0,min=None,max=None,step=None,variable=None,option='')

master为父控件。

label为要显示的标签。

integer的默认值为0,当值为1时,表示是整型数据。

min,max,step一起使用,其中min是数据的最小值,max为最

大值,step为变动步长。

variable可以设置一个变量。

options可以设置部件的外观式样等。

tix.Control控制窗口控件还有一些方法可以使用。

  • .invoke()方法模拟控件的动作,语法如下:
spinbox.invoke()
  • .update()方法更新控件的值,语法如下:
spinbox.update()
  • .decrement()方法显示上一个数据,语法如下:

    spinbox.decrement()
    
  • .increment()方法显示下一个数据,语法如下:

spinbox.increment()

看一个tix.Control控制窗口控件的演示代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-evdKwOMH-1614432086276)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201112172653570.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xFdsOgnX-1614432086277)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201112172708379.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tl4YcW3g-1614432086277)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20201112172721905.png)]

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值