首页 > 编程语言 >python库使用总结

python库使用总结

时间:2024-04-27 18:11:20浏览次数:20  
标签:总结 控件 python win text tk 使用 import root

python库的使用

1:print(补充)

image-20220129153548265

2:math

2.1:math库包括的4个数学常数

image-20220129165256875

2.2math库中的函数

image-20220129165737340

幂对数函数

image-20220129165802337

三角曲线函数

image-20220129165857959

3:字符串处理函数

image-20220129170054572

image-20220129170126808

image-20220129170138898

补充:sorted(str) 对字符串中的元素进行排序,返回排序后的列表,而不是字符串

​ reversed(str) 对字符串中的元素反向输出

3.1 字符串的格式化

image-20220129171212272

image-20220129171325739

image-20220129170650884

image-20220129170745455

转义字符

image-20220129171105095

4:eval()函数 (较危险,不建议使用!)

image-20220129170846797

5:序列通用方法

序列主要包括:字符串,元组,列表

image-20220129174820519

5.1 列表

image-20220129174911717

image-20220129174943799

辨析 ls.sort()和sorted()

image-20220129175034497

5.2 集合

image-20220129175224106

image-20220129175252244

image-20220129175340178

5.3 字典

image-20220129175409433

6:numpy

6.1 常用属性

image-20220131144838942

(1)image-20220131144915828

(2)image-20220131144944459

(3)image-20220131145003759

(4)image-20220131145031409

(5)image-20220131145058051

(6)astypeimage-20220202220528086

6.2 数据类型

image-20220131145126645

6.3 创建与常用操作

image-20220204195610776

image-20220131145340456

(1)arange

image-20220131145827384

image-20220131145651981

image-20220202220913623

(2)linspace

image-20220131150014239

image-20220131150058751

image-20220202220724347

(3)logspaceimage-20220202220939288

画图image-20220131150611754

(3)zeros

image-20220131150829204

image-20220131150819864

image-20220202221016628

(4)ones

image-20220131151250896

image-20220131151301721

image-20220202221009739

(5)empty

image-20220131151332935

image-20220131151346570

(6)eye

image-20220131151452065

image-20220131151743450

6.4 批量运算(广播运算)

image-20220131151905125

6.4.1 axis的应用

image-20220204203819335

image-20220204203830219

image-20220204203837981

image-20220204203845027

image-20220204203908246

image-20220204203917860

6.4.2 矩阵运算函数

image-20220204204120877

6.5 索引

image-20220131151933324

注:下面的好好看,有点难懂哦image-20220131152701913

注:多维的推荐第二种写法!

6.6 切片

image-20220131152752861

6.7 布尔型索引

image-20220131152834913

image-20220131152910822

image-20220131152924705

6.8 通用函数

image-20220131152955253

image-20220204195728094

image-20220204195737170

一元函数image-20220131154835781

二元函数image-20220131160845814

补充:cell是向上取, floor是向下取, rint是四舍五入,trunc是向0取

image-20220131160210544

log1p的含义image-20220131155014709

modf的含义image-20220131155150070

6.9 浮点数特殊值

image-20220131161023028

6.10 数字和统计方法

image-20220131161227091

6.11 随机数的生成

image-20220131161534035

random:生成0~1之间的数image-20220131161948288

randint 生成一个整数或N维整数数组image-20220202221345197

image-20220202221452840

image-20220131162300960

rand 生成一个[0,1)不包括1的随机浮点数或N维浮点数组。image-20220202221130797

image-20220131161939039

randn 取数范围:服从标准正态分布的随机样本值image-20220202221206601

choice:

numpy.random.choice(a, size=None, replace=True, p=None):
从序列中获取元素,若a为整数,元素取值为np.range(a)中随机数;若a为数组,取值为a数组元素中随机元素。

shuffleimage-20220131162829838

normal uniform poissonimage-20220202221601473

image-20220131163033476

6.12 矩阵的两种乘法

6.12.1 点乘

image-20220204204254208

6.12.2 星乘

image-20220204204323169

7.pandas

7.1 Series--一维数据对象

image-20220131163220107

7.1.1 使用特性

image-20220131163258490

7.1.2 整数索引

image-20220131163341374

7.1.3 数据对齐

image-20220131163414985

image-20220131163427943

image-20220131163451957

注:fill_value 是在nan的位置填充自己想要的值

7.1.4 缺失数据

image-20220131163822353

7.2 DataFrame--二维数据对象

image-20220131163856559

7.2.1 常用属性

image-20220131163916710

7.2.2 索引和切片

image-20220131163959998

image-20220131164435821

image-20220204204728468

image-20220204204816415

7.2.3 数据对齐与缺失数据

image-20220131164550671

7.2.4 其他常用方法

image-20220131164701324

image-20220131164709549

7.2.5 时间处理对象

image-20220131164730964

image-20220131164737471

7.2.6 时间序列

image-20220131164802279

7.2.7 文件处理

image-20220131164837840

image-20220131164846629

image-20220131164854973

image-20220131164904052

8.Matplotlib

image-20220131164959275

8.1 plot函数

image-20220204210420216

image-20220131165019881

8.2 图像标注

image-20220131165036792

image-20220204210451699

举例image-20220205195010028

8.3 画布subplot()

image-20220205201755248

import matplotlib.pyplot as plt
plt.plot([1,2,3])
#现在创建一个子图,它表示一个有2行1列的网格的顶部图。
#因为这个子图将与第一个重叠,所以之前创建的图将被删除
plt.subplot(211)
plt.plot(range(12))
#创建带有黄色背景的第二个子图
plt.subplot(212, facecolor='y')
plt.plot(range(12))

image-20220205201923201

  • 如果不想覆盖之前的图,需要使用 add_subplot() 函数,代码如下:
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot([1,2,3])
ax2 = fig.add_subplot(221, facecolor='y')
ax2.plot([1,2,3])

image-20220205202011821

8.4 多种样式图形绘画

8.4.1 双轴图

import matplotlib.pyplot as plt
import numpy as np
#创建图形对象
fig = plt.figure()
#添加子图区域
a1 = fig.add_axes([0,0,1,1])
#准备数据
x = np.arange(1,11)
#绘制指数函数
a1.plot(x,np.exp(x))
a1.set_ylabel('exp')
#添加双轴
a2 = a1.twinx()
#‘ro’表示红色圆点
a2.plot(x, np.log(x),'ro-')
#绘制对数函数
a2.set_ylabel('log')
#绘制图例
fig.legend(labels = ('exp','log'),loc='upper left')
plt.show()

image-20220205195213907

8.4.2 柱状图

image-20220205195329647

import matplotlib.pyplot as plt
#创建图形对象
fig = plt.figure()
#添加子图区域,参数值表示[left, bottom, width, height ]
ax = fig.add_axes([0,0,1,1])
#准备数据
langs = ['C', 'C++', 'Java', 'Python', 'PHP']
students = [23,17,35,29,12]
#绘制柱状图
ax.bar(langs,students)
plt.show()

image-20220205195534322

8.4.3 直方图

image-20220205195647994

image-20220205195656650

  • 以下示例绘制了班级学生得分情况的直方图。其中定义了四个区间(bins)分别是:0-25、26-50、51-75 和 76-100。直方图显示了相应范围的学生人数。
from matplotlib import pyplot as plt
import numpy as np
#创建图形对象和轴域对象
fig,ax = plt.subplots(1,1)
a = np.array([22,87,5,43,56,73,55,54,11,20,51,5,79,31,27])
#绘制直方图
ax.hist(a, bins = [0,25,50,75,100])
#设置坐标轴
ax.set_title("histogram of result")
ax.set_xticks([0,25,50,75,100])
ax.set_xlabel('marks')
ax.set_ylabel('no.of students')
plt.show()

image-20220205195744165

8.4.4 饼状图

image-20220205200512740

  • 以下示例:关于不同计算机语言学习人数的饼状图。autopct 参数设置为 %1.2f% ,并将各项所占总和的百分比显示在相对应的扇形区内。
from matplotlib import pyplot as plt
import numpy as np
#添加图形对象
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
#使得X/Y轴的间距相等
ax.axis('equal')
#准备数据
langs = ['C', 'C++', 'Java', 'Python', 'PHP']
students = [23,17,35,29,12]
#绘制饼状图
ax.pie(students, labels = langs,autopct='%1.2f%%')
plt.show()

image-20220205200545974

8.4.5 折线图

import matplotlib.pyplot as plt
#准备绘制数据
x = ["Mon", "Tues", "Wed", "Thur", "Fri","Sat","Sun"]
y = [20, 40, 35, 55, 42, 80, 50]
# "g" 表示红色,marksize用来设置'D'菱形的大小
plt.plot(x, y, "g", marker='D', markersize=5, label="周活")
#绘制坐标轴标签
plt.xlabel("登录时间")
plt.ylabel("用户活跃度")
plt.title("C语言中文网活跃度")
#显示图例
plt.legend(loc="lower right")
#调用 text()在图像上绘制注释文本
#x1、y1表示文本所处坐标位置,ha参数控制水平对齐方式, va控制垂直对齐方式,str(y1)表示要绘制的文本
for x1, y1 in zip(x, y):
    plt.text(x1, y1, str(y1), ha='center', va='bottom', fontsize=10)
#保存图片
plt.savefig("1.jpg")
plt.show()

image-20220205200623236

8.4.6 散点图

import matplotlib.pyplot as plt
girls_grades = [89, 90, 70, 89, 100, 80, 90, 100, 80, 34]
boys_grades = [30, 29, 49, 48, 100, 48, 38, 45, 20, 30]
grades_range = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
fig=plt.figure()
#添加绘图区域
ax=fig.add_axes([0,0,1,1])
ax.scatter(grades_range, girls_grades, color='r',label="girls")
ax.scatter(grades_range, boys_grades, color='b',label="boys")
ax.set_xlabel('Grades Range')
ax.set_ylabel('Grades Scored')
ax.set_title('scatter plot')
#添加图例
plt.legend()
plt.show()

image-20220205200656521

8.4.7 等高线图

  • Matplotlib API 提供了绘制等高线(contour)与填充等高线( contourf)的函数。这两个函数都需要三个参数,分别是 X、Y 与 Z。
import numpy as np
import matplotlib.pyplot as plt
#创建xlist、ylist数组
xlist = np.linspace(-3.0, 3.0, 100)
ylist = np.linspace(-3.0, 3.0, 100)
#将上述数据变成网格数据形式
X, Y = np.meshgrid(xlist, ylist)
#定义Z与X,Y之间的关系
Z = np.sqrt(X**2 + Y**2)
fig,ax=plt.subplots(1,1)
#填充等高线颜色
cp = ax.contourf(X, Y, Z)
fig.colorbar(cp) # 给图像添加颜色柱
ax.set_title('Filled Contours Plot')
ax.set_xlabel('x (cm)')
ax.set_ylabel('y (cm)')
#画等高线
plt.contour(X,Y,Z)
plt.show()

image-20220205200913630

8.4.8 振动图

image-20220205201006973

import matplotlib.pyplot as plt
import numpy as np
x,y = np.meshgrid(np.arange(-2, 2, 0.2), np.arange(-2, 2, 0.25))
z = x*np.exp(-x**2 - y**2)
#计算数组中元素的梯度
v, u = np.gradient(z, 0.2, 0.2)
fig, ax = plt.subplots()
q = ax.quiver(x,y,u,v)
plt.show()

image-20220205201025338

8.4.9 箱型图

image-20220205201126124

  • 首先准备创建箱型图所需数据:您可以使用numpy.random.normal()函数来创建一组基于正态分布的随机数据,该函数有三个参数,分别是正态分布的平均值、标准差以及期望值的数量。如下所示:
#利用随机数种子使每次生成的随机数相同
np.random.seed(10)
collectn_1 = np.random.normal(100, 10, 200)
collectn_2 = np.random.normal(80, 30, 200)
collectn_3 = np.random.normal(90, 20, 200)
collectn_4 = np.random.normal(70, 25, 200)
data_to_plot=[collectn_1,collectn_2,collectn_3,collectn_4]
  • 然后用 data_to_plot 变量指定创建箱型图所需的数据序列,最后用 boxplot() 函数绘制箱型图,如下所示:
fig = plt.figure()
#创建绘图区域
ax = fig.add_axes([0,0,1,1])
#创建箱型图
bp = ax.boxplot(data_to_plot)
plt.show()

image-20220205201226812

8.5 解决中文乱码

  • 重写配置文件
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"]=["SimHei"] #设置字体
plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题

9.os

import os

# 1. 获取当前脚本绝对路径
"""
abs_path = os.path.abspath(__file__)
print(abs_path)
"""

# 2. 获取当前文件的上级目录
"""
base_path = os.path.dirname( os.path.dirname(路径) )
print(base_path)
"""

# 3. 路径拼接
"""
p1 = os.path.join(base_path, 'xx')
print(p1)

p2 = os.path.join(base_path, 'xx', 'oo', 'a1.png')
print(p2)
"""

# 4. 判断路径是否存在
"""
exists = os.path.exists(p1)
print(exists)
"""

# 5. 创建文件夹
"""
os.makedirs(路径)
"""
"""
path = os.path.join(base_path, 'xx', 'oo', 'uuuu')
if not os.path.exists(path):
    os.makedirs(path)
"""

# 6. 是否是文件夹
"""
file_path = os.path.join(base_path, 'xx', 'oo', 'uuuu.png')
is_dir = os.path.isdir(file_path)
print(is_dir) # False

folder_path = os.path.join(base_path, 'xx', 'oo', 'uuuu')
is_dir = os.path.isdir(folder_path)
print(is_dir) # True

"""

# 7. 删除文件或文件夹
"""
os.remove("文件路径")
"""
"""
path = os.path.join(base_path, 'xx')
shutil.rmtree(path)
"""

#8.查看目录下所有的文件
"""
os.listdir("C:/")
"""

#9.查看目录下所有的文件(含子孙文件)  (返回的是个迭代器)
"""
os.walk("C:/")
"""
  • 下面的查着用,上面的是常用的,最好牢记!
os 模块常用属性和方法有:

os.sep: 可以取代操作系统特定的路径分隔符。windows下为  \ ;

os.name: 字符串指示你正在使用的平台。比如对于 Windows,它是nt,而对于 Linux/Unix 用户,它是 posix;

os.getcwd(): 函数得到当前工作目录,即当前 Python 脚本工作的目录路径;

os.listdir(path): 返回指定目录下的所有文件和目录名;

os.remove(path):该函数用来删除一个文件;

os.linesep: 字符串给出当前平台使用的行终止符;

os.path.split(path): 该函数返回一个路径的目录名和文件名;

os.path.isfile() 和os.path.isdir()函数分别检验给出的路径是一个文件还是目录;

os.path.exists(): 函数用来检验给出的路径是否真地存在;

os.curdir: 返回当前目录 (.);

os.mkdir(path): 创建一个目录;

os.makedirs(path): 递归的创建目录;

os.chdir(dirname): 改变工作目录到dirname;

os.path.getsize(name): 获得文件大小,如果name是目录返回0L;

os.path.abspath(name): 获得绝对路径;

os.path.normpath(path): 规范path字符串形式;

os.path.splitext(): 分离文件名与扩展名;

os.path.join(path,name): 连接目录与文件名或目录;

os.path.dirname(path): 返回文件路径;

os.walk(top,topdown=True,onerror=None): 遍历迭代目录;

os.rename(src, dst): 重命名file或者directory src到dst;

os.renames(old, new): 递归重命名文件夹或者文件,像rename() 。

10.shutil

shutil.copyfile( src, dst): 从源src复制到dst中去。当然前提是目标地址是具备可写权限。抛出的异常信息为IOException. 如果当前的dst已存在的话就会被覆盖掉。

shutil.move( src, dst): 移动文件或重命名文件;

shutil.copymode( src, dst): 只是会复制其权限其他的东西是不会被复制的;

shutil.copystat( src, dst): 复制权限、最后访问时间、最后修改时间;

shutil.copy( src, dst): 复制一个文件到一个文件或一个目录;

shutil.copy2( src, dst) : 在copy的基础上再将文件的最后访问时间与修改时间也复制过来了;

shutil.copy2( src, dst): 如果两个位置的文件系统是一样的话相当于是rename操作,只是改名;如果是不在相同的文件系统的话就是做move操作;

shutil.copytree( olddir, newdir, True/Flase) : 把 olddir 拷贝一份 newdir ,如果第3个参数是True,则复制目录时将保持文件夹下的符号连接,如果第3个参数是False,则将在复制的目录下生成物理副本来替代符号连接;

shutil.rmtree( src ) : 递归删除一个目录以及目录内的所有内容。

压缩文件

import shutil

# 1. 压缩文件
"""
# base_name,压缩后的压缩包文件
# format,压缩的格式,例如:"zip", "tar", "gztar", "bztar", or "xztar".
# root_dir,要压缩的文件夹路径
"""
# shutil.make_archive(base_name=r'datafile',format='zip',root_dir=r'files')


# 2. 解压文件
"""
# filename,要解压的压缩包文件
# extract_dir,解压的路径
# format,压缩文件格式
"""
# shutil.unpack_archive(filename=r'datafile.zip', extract_dir=r'xxxxxx/xo', format='zip')

11.random

import random

# 1. 获取范围内的随机整数
v = random.randint(10, 20)
print(v)

# 2. 获取范围内的随机小数
v = random.uniform(1, 10)
print(v)

# 3. 随机抽取一个元素
v = random.choice([11, 22, 33, 44, 55])
print(v)

# 4. 随机抽取多个元素
v = random.sample([11, 22, 33, 44, 55], 3)
print(v)

# 5. 打乱顺序
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
random.shuffle(data)
print(data)

12.string

#string.ascii_letters:生成所有大小写字母。
import string
print(string.ascii_letters)
执行结果:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

#string.ascii_lowercase:生成所有小写字母。
import string
print(string.ascii_lowercase)
执行结果:
abcdefghijklmnopqrstuvwxyz

#ascii_uppercase:生成所有大写字母。
import string
print(string.ascii_uppercase)
执行结果:
ABCDEFGHIJKLMNOPQRSTUVWXYZ

#digits:生成所有数字。
import string
print(string.digits)
执行结果:
0123456789

#punctuation:生成所有标点符号。
import string
print(string.punctuation)
执行结果:
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

13.openpyxl

13.1 读Excel

from openpyxl import load_workbook

wb = load_workbook("files/p1.xlsx")
sheet = wb.worksheets[0]

# 1.获取第N行第N列的单元格(位置是从1开始)
"""
cell = sheet.cell(1, 1)

print(cell.value)
print(cell.style)
print(cell.font)
print(cell.alignment)
"""

# 2.获取某个单元格
"""
c1 = sheet["A2"]
print(c1.value)

c2 = sheet['D4']
print(c2.value)
"""

# 3.第N行所有的单元格
"""
for cell in sheet[1]:
    print(cell.value)
"""

# 4.所有行的数据(获取某一行数据)
"""
for row in sheet.rows:
    print(row[0].value, row[1].value)
"""

# 5.获取所有列的数据
"""
for col in sheet.columns:
    print(col[1].value)
"""
from openpyxl import load_workbook

wb = load_workbook("files/p1.xlsx")
sheet = wb.worksheets[2]

# 获取第N行第N列的单元格(位置是从1开始)
c1 = sheet.cell(1, 1)
print(c1)  # <Cell 'Sheet1'.A1>
print(c1.value) # 用户信息

c2 = sheet.cell(1, 2)
print(c2)  # <MergedCell 'Sheet1'.B1>
print(c2.value) # None
from openpyxl import load_workbook

wb = load_workbook('files/p1.xlsx')
sheet = wb.worksheets[2]
for row in sheet.rows:
    print(row)
    
>>> 输出结果
(<Cell 'Sheet1'.A1>, <MergedCell 'Sheet1'.B1>, <Cell 'Sheet1'.C1>)
(<Cell 'Sheet1'.A2>, <Cell 'Sheet1'.B2>, <Cell 'Sheet1'.C2>)
(<Cell 'Sheet1'.A3>, <Cell 'Sheet1'.B3>, <Cell 'Sheet1'.C3>)
(<MergedCell 'Sheet1'.A4>, <Cell 'Sheet1'.B4>, <Cell 'Sheet1'.C4>)   #这一行的mergecell就代表合并的单元格
(<Cell 'Sheet1'.A5>, <Cell 'Sheet1'.B5>, <Cell 'Sheet1'.C5>)

13.2 写Excel

  • 原Excel文件基础上写内容
from openpyxl import load_workbook

wb = load_workbook('files/p1.xlsx')
sheet = wb.worksheets[0]

# 找到单元格,并修改单元格的内容
cell = sheet.cell(1, 1)
cell.value = "新的开始"

# 将excel文件保存到p2.xlsx文件中
wb.save("files/p2.xlsx")
  • 新创建Excel文件写内容
 from openpyxl import workbook

# 创建excel且默认会创建一个sheet(名称为Sheet)
wb = workbook.Workbook()

sheet = wb.worksheets[0] # 或 sheet = wb["Sheet"]

# 找到单元格,并修改单元格的内容
cell = sheet.cell(1, 1)
cell.value = "新的开始"

# 将excel文件保存到p2.xlsx文件中
wb.save("files/p2.xlsx")

13.3 对Excel格子的一些操作(用时查)

from openpyxl import workbook

wb = workbook.Workbook() # Sheet

# 1. 修改sheet名称
"""
sheet = wb.worksheets[0]
sheet.title = "数据集"
wb.save("p2.xlsx")
"""

# 2. 创建sheet并设置sheet颜色
"""
sheet = wb.create_sheet("工作计划", 0)
sheet.sheet_properties.tabColor = "1072BA"
wb.save("p2.xlsx")
"""

# 3. 默认打开的sheet
"""
wb.active = 0
wb.save("p2.xlsx")
"""

# 4. 拷贝sheet
"""
sheet = wb.create_sheet("工作计划")
sheet.sheet_properties.tabColor = "1072BA"

new_sheet = wb.copy_worksheet(wb["Sheet"])
new_sheet.title = "新的计划"
wb.save("p2.xlsx")
"""

# 5.删除sheet
"""
del wb["用户列表"]
wb.save('files/p2.xlsx')
"""
from openpyxl import load_workbook
from openpyxl.styles import Alignment, Border, Side, Font, PatternFill, GradientFill


wb = load_workbook('files/p1.xlsx')

sheet = wb.worksheets[1]

# 1. 获取某个单元格,修改值
"""
cell = sheet.cell(1, 1)
cell.value = "开始"
wb.save("p2.xlsx")
"""

# 2.  获取某个单元格,修改值
"""
sheet["B3"] = "Alex"
wb.save("p2.xlsx")
"""

# 3. 获取某些单元格,修改值
"""
cell_list = sheet["B2":"C3"]
for row in cell_list:
    for cell in row:
        cell.value = "新的值"
wb.save("p2.xlsx")
"""

# 4. 对齐方式
"""
cell = sheet.cell(1, 1)

# horizontal,水平方向对齐方式:"general", "left", "center", "right", "fill", "justify", "centerContinuous", "distributed"
# vertical,垂直方向对齐方式:"top", "center", "bottom", "justify", "distributed"
# text_rotation,旋转角度。
# wrap_text,是否自动换行。
cell.alignment = Alignment(horizontal='center', vertical='distributed', text_rotation=45, wrap_text=True)
wb.save("p2.xlsx")
"""

# 5. 边框
# side的style有如下:dashDot','dashDotDot', 'dashed','dotted','double','hair', 'medium', 'mediumDashDot', 'mediumDashDotDot','mediumDashed', 'slantDashDot', 'thick', 'thin'
"""
cell = sheet.cell(9, 2)
cell.border = Border(
    top=Side(style="thin", color="FFB6C1"), 
    bottom=Side(style="dashed", color="FFB6C1"),
    left=Side(style="dashed", color="FFB6C1"),
    right=Side(style="dashed", color="9932CC"),
    diagonal=Side(style="thin", color="483D8B"),  # 对角线
    diagonalUp=True,  # 左下 ~ 右上
    diagonalDown=True  # 左上 ~ 右下
)
wb.save("p2.xlsx")
"""

# 6.字体
"""
cell = sheet.cell(5, 1)
cell.font = Font(name="微软雅黑", size=45, color="ff0000", underline="single")
wb.save("p2.xlsx")
"""

# 7.背景色
"""
cell = sheet.cell(5, 3)
cell.fill = PatternFill("solid", fgColor="99ccff")
wb.save("p2.xlsx")
"""

# 8.渐变背景色
"""
cell = sheet.cell(5, 5)
cell.fill = GradientFill("linear", stop=("FFFFFF", "99ccff", "000000"))
wb.save("p2.xlsx")
"""

# 9.宽高(索引从1开始)
"""
sheet.row_dimensions[1].height = 50
sheet.column_dimensions["E"].width = 100
wb.save("p2.xlsx")
"""

# 10.合并单元格
"""
sheet.merge_cells("B2:D8")
sheet.merge_cells(start_row=15, start_column=3, end_row=18, end_column=8)
wb.save("p2.xlsx")
"""
"""
sheet.unmerge_cells("B2:D8")
wb.save("p2.xlsx")
"""

# 11.写入公式
"""
sheet = wb.worksheets[3]
sheet["D1"] = "合计"
sheet["D2"] = "=B2*C2"
wb.save("p2.xlsx")
"""
"""
sheet = wb.worksheets[3]
sheet["D3"] = "=SUM(B3,C3)"
wb.save("p2.xlsx")
"""

# 12.删除
"""
# idx,要删除的索引位置
# amount,从索引位置开始要删除的个数(默认为1)
sheet.delete_rows(idx=1, amount=20)
sheet.delete_cols(idx=1, amount=3)
wb.save("p2.xlsx")
"""

# 13.插入
"""
sheet.insert_rows(idx=5, amount=10)
sheet.insert_cols(idx=3, amount=2)
wb.save("p2.xlsx")
"""

# 14.循环写内容
"""
sheet = wb["Sheet"]
cell_range = sheet['A1:C2']
for row in cell_range:
    for cell in row:
        cell.value = "xx"

for row in sheet.iter_rows(min_row=5, min_col=1, max_col=7, max_row=10):
    for cell in row:
        cell.value = "oo"
wb.save("p2.xlsx")
"""
 
# 15.移动   #正整数表示向下或向右,负整数为向上或向左
"""
# 将H2:J10范围的数据,向右移动15个位置、向上移动1个位置
sheet.move_range("H2:J10",rows=-1, cols=15)
wb.save("p2.xlsx")
"""
"""
sheet = wb.worksheets[3]
sheet["D1"] = "合计"
sheet["D2"] = "=B2*C2"
sheet["D3"] = "=SUM(B3,C3)"
sheet.move_range("B1:D3",cols=10, translate=True) # 自动翻译公式
wb.save("p2.xlsx")
"""

# 16.打印区域
"""
sheet.print_area = "A1:D200"
wb.save("p2.xlsx")
"""

# 17.打印时,每个页面的固定表头
"""
sheet.print_title_cols = "A:D"
sheet.print_title_rows = "1:3"
wb.save("p2.xlsx")
"""

14.内置函数(全)

image-20220205211527828

1. abs # 求绝对值
2. all #Return True if bool(x) is True for all values x in the iterable.If the iterable is empty, return
True.
3. any #Return True if bool(x) is True for any x in the iterable.If the iterable is empty, return
False.
4. ascii #Return an ASCII-only representation of an object,ascii(“中国”) 返回”‘\u4e2d\u56fd’”
5. bin #返回整数的2进制格式
6. bool # 判断⼀个数据结构是True or False, bool({}) 返回就是False, 因为是空dict
7. bytearray # 把byte变成 bytearray, 可修改的数组
8. bytes # bytes(“中国”,”gbk”)
9. callable # 判断⼀个对象是否可调⽤
10. chr # 返回⼀个数字对应的ascii字符 , ⽐如chr(90)返回ascii⾥的’Z’
11. classmethod #⾯向对象时⽤,现在忽略
12. compile #py解释器⾃⼰⽤的东⻄,忽略
13. complex #求复数,⼀般⼈⽤不到
14. copyright #没⽤
15. credits #没⽤
16. delattr #⾯向对象时⽤,现在忽略
17. dict #⽣成⼀个空dict
18. dir #返回对象的可调⽤属性
19. divmod #返回除法的商和余数 ,⽐如divmod(4,2),结果(2, 0)
20. enumerate #返回列表的索引和元素,⽐如 d = [“alex”,”jack”],enumerate(d)后,得到(0, ‘alex’)
(1, ‘jack’)
21. eval #可以把字符串形式的list,dict,set,tuple,再转换成其原有的数据类型。
22. exec #把字符串格式的代码,进⾏解义并执⾏,⽐如exec(“print(‘hellworld’)”),会解义⾥⾯的字符
串并执⾏
23. exit #退出程序
24. filter #对list、dict、set、tuple等可迭代对象进⾏过滤, filter(lambda x:x>10,
[0,1,23,3,4,4,5,6,67,7])过滤出所有⼤于10的值
25. float #转成浮点
26. format #没⽤
27. frozenset #把⼀个集合变成不可修改的
28. getattr #⾯向对象时⽤,现在忽略
29. globals #打印全局作⽤域⾥的值
30. hasattr #⾯向对象时⽤,现在忽略
31. hash #hash函数
32. help
33. hex #返回⼀个10进制的16进制表示形式,hex(10) 返回’0xa’
34. id #查看对象内存地址
35. input
36. int
37. isinstance #判断⼀个数据结构的类型,⽐如判断a是不是fronzenset, isinstance(a,frozenset) 返
回 True or False
38. issubclass #⾯向对象时⽤,现在忽略
39. iter #把⼀个数据结构变成迭代器,讲了迭代器就明⽩了
40. len
41. list
42. locals
43. map # map(lambda x:x**2,[1,2,3,43,45,5,6,]) 输出 [1, 4, 9, 1849, 2025, 25, 36]
44. max # 求最⼤值
45. memoryview # ⼀般⼈不⽤,忽略
46. min # 求最⼩值
47. next # ⽣成器会⽤到,现在忽略
48. object #⾯向对象时⽤,现在忽略
49. oct # 返回10进制数的8进制表示
50. open
51. ord # 返回ascii的字符对应的10进制数 ord(‘a’) 返回97,
52. print
53. property #⾯向对象时⽤,现在忽略
54. quit
55. range
56. repr #没什么⽤
57. reversed # 可以把⼀个列表反转
58. round #可以把⼩数4舍5⼊成整数 ,round(10.15,1) 得10.2
59. set
60. setattr #⾯向对象时⽤,现在忽略
61. slice # 没⽤
62. sorted
63. staticmethod #⾯向对象时⽤,现在忽略
64. str
65. sum #求和,a=[1, 4, 9, 1849, 2025, 25, 36],sum(a) 得3949
66. super #⾯向对象时⽤,现在忽略
67. tuple
68. type
69. vars #返回⼀个对象的属性,⾯向对象时就明⽩了
70. zip #可以把2个或多个列表拼成⼀个, a=[1, 4, 9, 1849, 2025, 25, 36],b = [“a”,”b”,”c”,”d”],

15.time

time.localtime([secs]) :将⼀个时间戳转换为当前时区的struct_time。若secs参数未提供,则以当前时间为准。
time.gmtime([secs]) :和localtime()⽅法类似,gmtime()⽅法是将⼀个时间戳转换为UTC时区(0时区)的struct_time。
time.time() :返回当前时间的时间戳。
time.mktime(t) :将⼀个struct_time转化为时间戳。
time.sleep(secs) :线程推迟指定的时间运⾏,单位为秒。
索引(Index) 属性(Attribute) 值(Values)
0 tm_year(年) ⽐如2011
1 tm_mon(⽉) 1 - 12
2 tm_mday(⽇) 1 - 31
3 tm_hour(时) 0 - 23
4 tm_min(分) 0 - 59
5 tm_sec(秒) 0 - 61
6 tm_wday(weekday) 0 - 6(0表示周⼀)
7 tm_yday(⼀年中的第⼏天) 1 - 366
8 tm_isdst(是否是夏令时) 默认为-1
time.strftime(format[, t]) :把⼀个代表时间的元组或者struct_time(如由time.localtime()和time.gmtime()返回)转化为格式化的时间字符串。如果t未指定,将传⼊time.localtime()。
举例: time.strftime(“%Y-%m-%d %X”, time.localtime()) #输出’2017-10-01 12:14:23’
time.strptime(string[, format]) :把⼀个格式化时间字符串转化为struct_time。实际上它和strftime()是逆操作。
举例: time.strptime(‘2017-10-3 17:54’,”%Y-%m-%d %H:%M”) #输出
time.struct_time(tm_year=2017, tm_mon=10, tm_mday=3, tm_hour=17, tm_min=54,tm_sec=0, tm_wday=1, tm_yday=276, tm_isdst=-1)
  • 字符串转时间格式对应表

image-20220205212454483image-20220205212511612

image-20220205212524771

16.datetime

datetime.date:表示⽇期的类。常⽤的属性有year, month, day;
datetime.time:表示时间的类。常⽤的属性有hour, minute, second, microsecond;
datetime.datetime:表示⽇期时间。
datetime.timedelta:表示时间间隔,即两个时间点之间的⻓度。
datetime.tzinfo:与时区有关的相关信息。(这⾥不详细充分讨论该类,感兴趣的童鞋可以参考python⼿册)

image-20220205212905741

  • 时间运算
>>> datetime.datetime.now()
datetime.datetime(2017, 10, 1, 12, 53, 11, 821218)
>>> datetime.datetime.now() + datetime.timedelta(4) #当前时间 +4天
datetime.datetime(2017, 10, 5, 12, 53, 35, 276589)
>>> datetime.datetime.now() + datetime.timedelta(hours=4) #当前时间+4⼩时
datetime.datetime(2017, 10, 1, 16, 53, 42, 876275)
  • 时间替换
>>> d.replace(year=2999,month=11,day=30)
datetime.date(2999, 11, 30)

17.turtle

17.1 画布(canvas)

#  设置画布大小

#参数分别为画布的宽(单位像素), 高, 背景颜色
turtle.screensize(canvwidth=None, canvheight=None, bg=None) 

"""
 如:turtle.screensize(800,600, "green")
	turtle.screensize() #返回默认大小(400, 300)
"""

turtle.setup(width=0.5, height=0.75, startx=None, starty=None),
#参数:width, height: 输入宽和高为整数时, 表示像素; 为小数时, 表示占据电脑屏幕的比例,(startx, starty): 这一坐标表示矩形窗	   口左上角顶点的位置, 如果为空,则窗口位于屏幕中心。

"""
如:turtle.setup(width=0.6,height=0.6)
turtle.setup(width=800,height=800, startx=100, starty=100)
"""

17.2 画笔

17.2.1 画笔的状态

​ 在画布上,默认有一个坐标原点为画布中心的坐标轴,坐标原点上有一只面朝x轴正方向小乌龟。这里我们描述小乌龟时使用了两个词语:坐标原点(位置),面朝x轴正方向(方向), turtle绘图中,就是使用位置方向描述小乌龟(画笔)的状态。

17.2.2 画笔的属性

画笔(画笔的属性,颜色、画线的宽度等)

# 设置画笔的宽度;
turtle.pensize()
# 没有参数传入,返回当前画笔颜色,传入参数设置画笔颜色,可以是字符串如"green", "red",也可以是RGB 3元组。
turtle.pencolor()
# 设置画笔移动速度,画笔绘制的速度范围[0,10]整数,数字越大越快。
turtle.speed(speed)

17.2.3 绘图命令

  • 画笔运动命令

image-20220317132102950

  • 画笔控制命令

image-20220317132127707

  • 全局控制命令

image-20220317132201001

  • 其他命令

image-20220317132222178

17.3 命令详解

turtle.circle(radius, extent=None, steps=None)

"""
        描述:以给定半径画圆

        参数:

        radius(半径):半径为正(负),表示圆心在画笔的左边(右边)画圆;

        extent(弧度) (optional);

        steps (optional) (做半径为radius的圆的内切正多边形,多边形边数为steps)。
"""

circle(50) # 整圆;

circle(50,steps=3) # 三角形;

circle(120, 180) # 半圆

实例

  • 太阳花
# coding=utf-8
import turtle
import time
  
# 同时设置pencolor=color1, fillcolor=color2
turtle.color("red", "yellow")
  
turtle.begin_fill()
for _ in range(50):
turtle.forward(200)
turtle.left(170)
turtle.end_fill()
  
turtle.mainloop()

image-20220317132448454

  • 五角星
# coding=utf-8
import turtle
import time
  
turtle.pensize(5)
turtle.pencolor("yellow")
turtle.fillcolor("red")
  
turtle.begin_fill()
for _ in range(5):
  turtle.forward(200)
  turtle.right(144)
turtle.end_fill()
time.sleep(2)
  
turtle.penup()
turtle.goto(-150,-120)
turtle.color("violet")
turtle.write("Done", font=('Arial', 40, 'normal'))
  
turtle.mainloop()

image-20220317132516017

  • 时钟程序
# coding=utf-8
  
import turtle
from datetime import *
  
# 抬起画笔,向前运动一段距离放下
def Skip(step):
    turtle.penup()
    turtle.forward(step)
    turtle.pendown()
  
def mkHand(name, length):
    # 注册Turtle形状,建立表针Turtle
    turtle.reset()
    Skip(-length * 0.1)
    # 开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。
    turtle.begin_poly()
    turtle.forward(length * 1.1)
    # 停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。
    turtle.end_poly()
    # 返回最后记录的多边形。
    handForm = turtle.get_poly()
    turtle.register_shape(name, handForm)
  
def Init():
    global secHand, minHand, hurHand, printer
    # 重置Turtle指向北
    turtle.mode("logo")
    # 建立三个表针Turtle并初始化
    mkHand("secHand", 135)
    mkHand("minHand", 125)
    mkHand("hurHand", 90)
    secHand = turtle.Turtle()
    secHand.shape("secHand")
    minHand = turtle.Turtle()
    minHand.shape("minHand")
    hurHand = turtle.Turtle()
    hurHand.shape("hurHand")
    
    for hand in secHand, minHand, hurHand:
        hand.shapesize(1, 1, 3)
        hand.speed(0)
    
    # 建立输出文字Turtle
    printer = turtle.Turtle()
    # 隐藏画笔的turtle形状
    printer.hideturtle()
    printer.penup()
     
def SetupClock(radius):
    # 建立表的外框
    turtle.reset()
    turtle.pensize(7)
    for i in range(60):
        Skip(radius)
        if i % 5 == 0:
            turtle.forward(20)
            Skip(-radius - 20)
            
            Skip(radius + 20)
            if i == 0:
                turtle.write(int(12), align="center", font=("Courier", 14, "bold"))
            elif i == 30:
                Skip(25)
                turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
                Skip(-25)
            elif (i == 25 or i == 35):
                Skip(20)
                turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
                Skip(-20)
            else:
                turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))
            Skip(-radius - 20)
        else:
            turtle.dot(5)
            Skip(-radius)
        turtle.right(6)
         
def Week(t):  
    week = ["星期一", "星期二", "星期三",
            "星期四", "星期五", "星期六", "星期日"]
    return week[t.weekday()]
  
def Date(t):
    y = t.year
    m = t.month
    d = t.day
    return "%s %d%d" % (y, m, d)
  
def Tick():
    # 绘制表针的动态显示
    t = datetime.today()
    second = t.second + t.microsecond * 0.000001
    minute = t.minute + second / 60.0
    hour = t.hour + minute / 60.0
    secHand.setheading(6 * second)
    minHand.setheading(6 * minute)
    hurHand.setheading(30 * hour)
     
    turtle.tracer(False)
    printer.forward(65)
    printer.write(Week(t), align="center",
                  font=("Courier", 14, "bold"))
    printer.back(130)
    printer.write(Date(t), align="center",
                  font=("Courier", 14, "bold"))
    printer.home()
    turtle.tracer(True)
  
    # 100ms后继续调用tick
    turtle.ontimer(Tick, 100)
  
def main():
    # 打开/关闭龟动画,并为更新图纸设置延迟。
    turtle.tracer(False)
    Init()
    SetupClock(160)
    turtle.tracer(True)
    Tick()
    turtle.mainloop()
  
if __name__ == "__main__":
    main()

image-20220317132545562

18.pyautogui

  • 什么是GUI自动化
  • GUI自动化就是写程序直接控制键盘和鼠标。这些程序可以控制其他应用,向它们发送虚拟的击键和鼠标点击,就像你自己坐在计算机前与应用交互一样。这种技术被称为“图形用户界面自动化”,或简称为“GUI 自动化”。有了 GUI 自动化,你的程序就像一个活人用户坐在计算机前一样,能做任何事情,除了将咖啡泼在键盘上。

  • 也可以将 GUI 自动化看成是对一个机械臂编程。你可以对机械臂编程,让它敲键盘或移动鼠标。对于涉及许多无脑点击或填表的任务,这种技术特别有用。

18.1 控制鼠标移动

  • pyautogui坐标的处理

    ​ pyautogui 的鼠标函数使用 x、y 坐标。原点的 x、y 都是零,在屏幕的左上角。向右 x 坐标增加,向下 y 坐标增加。所有坐标都是正整数,没有负数坐标。

image-20220329090850535

  • 分辨率

    ​ 分辨率是屏幕的宽和高有多少像素。如果屏幕的分辨率设置为 1920 × 1080,那么左上角的坐标是(0,0),右下角的坐标是(1919,1079)。

  • 获取屏幕的宽和高的像素数
# pyautogui.size() 函数返回两个整数的元组,包含屏幕的宽和高的像素数

import pyautogui
width, height = pyautogui.size()
print(width,height)
  • 移动鼠标

    • pyautogui.moveTo() 函数将鼠标立即移动到屏幕的指定位置。
    """
    表示 x、y 坐标的整数值分别构成了函数的第一个和第二个参数。
    可选的 duration 整数或浮点数关键字参数,指定了将鼠标移到目的位置所需的秒数。如果不指定,默认值是零,表示立即移动(在 PyAutoGUI 函数中,所有的 duration 关键字参数都是可选的)。
    """
    
    import pyautogui
    for i in range(5):
        pyautogui.moveTo(100, 100, duration=0.25)
        pyautogui.moveTo(200, 100, duration=0.25)
        pyautogui.moveTo(200, 200, duration=0.25)
        pyautogui.moveTo(100, 200, duration=0.25)
    
    • pyautogui.moveRel() 函数相对于当前的位置移动鼠标.
    """
    该函数可以接受 3 个参数:向右水平移动多少个像素,向下垂直移动多少个像素,以及(可选的)花多少时间完成移动。为第一第二个参数提供负整数,鼠标将向左或向上移动。
    """
    
    import pyautogui
    for i in range(5):
        pyautogui.moveRel(100, 0, duration=0.25)
        pyautogui.moveRel(0, 100, duration=0.25)
        pyautogui.moveRel(-100, 0, duration=0.25)
        pyautogui.moveRel(0, -100, duration=0.25)
        
    # move 的效果也一样
    
    • 获取鼠标位置
    """
    通过调用 pyautogui.position() 函数,可以确定鼠标当前的位置。它将返回函数调用时,鼠标 x、y 坐标的元组.
    """
    pyautogui.position()
    
    # 返回 >> Point(x=1188, y=499)
    

18.2 控制鼠标的交互

  • 点击鼠标
"""
要向计算机发送虚拟的鼠标点击,就调用 pyautogui.click() 方法。默认情况下,点击将使用鼠标左键,点击发生在鼠标当前所在位置。如果希望点击在鼠标当前位置以外的地方发生,可以传入 x、y 坐标作为可选的第一第二参数。
"""

# 鼠标点击
#实现:鼠标移到屏幕左上角的位置,并点击一次。完整的“点击”是指按下鼠标按键,然后放开,同时不移动位置
import pyautogui
pyautogui.click(10, 5)


# 指定鼠标按键
# 如果想指定鼠标按键,就加入 button 关键字参数,值分别为 'left'、'middle'或 'right'。例如,pyautogui.click(100,150,button='left')将在坐标(100,150)处点击鼠标左键。而 pyautogui.click(200,250,button='right')将在坐标(200,250)处点击右键。
import pyautogui
pyautogui.click(600, 509,button='right')


# 实现点击的其他方法
"""
pyautogui. mouseDown()
只是按下鼠标按键
pyautogui.mouseUp()
只是释放鼠标按键
pyautogui.doubleClick()
执行双击鼠标左键
pyautogui.rightClick(),pyautogui.middleClick()
分别执行双击右键和双击中键
"""
  • 拖动鼠标
"""
PyAutoGUI 提供了 pyautogui.dragTo() 和 pyautogui.dragRel() 函数,将鼠标拖动到一个新的位置,或相对当前位置的位置。 dragTo() 和 dragRel() 的参数与moveTo() 和 moveRel() 相同:x 坐标/水平移动,y 坐标/垂直移动,以及可选的时间间隔(在 OS X 上,如果鼠标移动太快,拖动会不对,所以建议提供 duration 关键字参数)。
"""

import pyautogui, time
time.sleep(2)
pyautogui.click()
distance = 200
while distance > 0:
    pyautogui.dragRel(distance, 0, duration=0.2,button='left') # move right
    distance = distance - 5
    pyautogui.dragRel(0, distance, duration=0.2,button='left') # move down
    pyautogui.dragRel(-distance, 0, duration=0.2,button='left') # move left
    distance = distance - 5
    pyautogui.dragRel(0, -distance, duration=0.2,button='left') # move up
  • 滚动鼠标
"""
	最后一个 pyautogui 鼠标函数是 scroll()。你向它提供一个整型参数,说明向上或向下滚动多少单位,滚动发生在鼠标的当前位置。
	单位的意义在每个操作系统和应用上不一样,所以你必须试验,看看在你的情况下滚动多远。
	传递正整数表示向上滚动,传递负整数表示向下滚动
"""

import pyautogui, time
time.sleep(2)
pyautogui.scroll(-300)

18.3 处理屏幕

  • 获取屏幕快照
"""
要在 Python 中获取屏幕快照,就调用 pyautogui.screenshot() 函数,函数将返回包含一个屏幕快照的 Image 对象.
"""

import pyautogui
im = pyautogui.screenshot()
im.save('./123.png')


# Image对象getpixel()
"""
getpixel() 函数传入坐标元组它将告诉你图像中这些坐标处的像素颜色。getpixel() 函数的返回值是一个 RGB 元组,包含 4 个整数,表示像素的红绿蓝值和透明度。
这就是你的程序“看到”当前屏幕上内容的方法。
"""
import pyautogui
im.getpixel((23,560))


# pixelMatchesColor() 函数
"""
参数:
	第一和第二个参数是整数,对应 x 和 y 坐标。第三个参数是一个元组,包含 3 个整数,是屏幕像素必须匹配的 RGB 颜色
返回值:
	如果屏幕上指定的 x、y 坐标处的像素与指定的颜色匹配,PyAutoGUI 的pixelMatchesColor() 函数将返回 True。
"""
import pyautogui
im = pyautogui.screenshot()
print(im.getpixel((500, 200)))
result = pyautogui.pixelMatchesColor(300, 200, (248, 248, 248))
print(result)

# 结果 >> (248, 248, 248, 255)
#		 False
  • 图像识别
# 打开腾讯会议,识别【加入会议】按钮,对其进行点击操作

import cv2
import pyautogui
import time
time.sleep(2)
#获取带有腾讯会议的屏幕快照且保存到本地
im = pyautogui.screenshot()
im.save('screen.png')

#基于cv2读取照片
screen = cv2.imread('./screen.png')
joinMeeting = cv2.imread('./joinMeeting.png')
#在屏幕快照中对比加入会议按钮照片,定位其准确位置
result = cv2.matchTemplate(joinMeeting,screen, cv2.TM_CCOEFF_NORMED)
#result是一个二维列表,列表中最大值元素的位置就是我们对比后相似度最高的图片【最上角】位置
print(result)

#minMaxLoc返回一个元组,其中三个元素,以此为最不相似点分数,最相似点分数,最不相似点位置坐标,最相似点位置坐标
pos_start = cv2.minMaxLoc(result)[3] #获取最相似点相似坐标
print(pos_start) 
# x = pos_start[0]
# y = pos_start[1]

#定位到点击图片的中间位置
x = int(pos_start[0]) + int(joinMeeting.shape[1] / 2)
y = int(pos_start[1]) + int(joinMeeting.shape[0] / 2)

time.sleep(1)
pyautogui.click(x,y)

18.4 控制键盘

  • 通过键盘发送一个字符串
"""
pyautogui.typewrite() 函数向计算机发送虚拟按键。这些按键产生什么效果,取决于当前获得焦点的窗口和文本输入框。可能需要先向文本输入框发送一次鼠标点击,确保它获得焦点。
"""

import pyautogui
import time
time.sleep(2)
pyautogui.click(300, 300)
time.sleep(2)
pyautogui.typewrite('Hello world!',interval=0.25)


"""
- typewrite()参数介绍:
    - message:键盘录入的内容
        - 字符串
        - 列表:键字符串的列表
            - pyautogui.typewrite(['a', 'b', 'left', 'left', 'X', 'Y'])
    - interval:在每个字符之间添加短时间暂停
    - 注意:对于 A 或!这样的字符,pyautogui 将自动模拟按住 Shift 键。
"""
  • 键名传输

不是所有的键都很容易用单个文本字符来表示。例如,如何把 Shift 键或左箭头键表示为单个字符?在 PyAutoGUI 中,这些键表示为短的字符值:'esc' 表示 Esc 键,'enter' 表示 Enter。

image-20220329094146355image-20220329094200245

# press 按下按键

import pyautogui
import time
time.sleep(2)
pyautogui.click(300, 300)
time.sleep(2)
pyautogui.typewrite('Hello world!',interval=0.25)
time.sleep(1)
pyautogui.press('enter')
time.sleep(2)
pyautogui.typewrite('Hello world!',interval=0.25)

# 按下和释放键盘
"""
就像 mouseDown() 和 mouseUp() 函数一样,pyautogui.keyDown() 和 pyautogui.keyUp() 将向计算发送虚拟的按键和释放。方便起见,pyautogui 提供了pyautogui.press() 函数,它调用这两个函数,模拟完整的击键。
"""

import pyautogui
import time
time.sleep(2)
pyautogui.keyDown('shift')
pyautogui.press('4')
pyautogui.keyUp('shift')

# 热键组合
"""
	“热键”或“快捷键”是一种按键组合,它调用某种应用功能。拷贝选择内容的常用热键是 Ctrl-C。用户按住Ctrl键,然后按C键,然后释放C和Ctrl键。
	要用pyautogui的keyDown() 和keyUp() 函数来做到这一点
"""

import pyautogui
import time
time.sleep(2)
pyautogui.keyDown('command')
pyautogui.press('v')
pyautogui.keyUp('command')


"""
这相当复杂。作为替代,可以使用 pyautogui.hotkey() 函数,它接受多个键字符串参数,按顺序按下,再按相反的顺序释放。例如对于 Ctrl-C,代码就像下面这样简单.
"""

import pyautogui
import time
time.sleep(2)
pyautogui.hotkey('command', 'v')

18.4 项目实战

  • 微信自动化
import cv2
import os
import pyperclip #用于复制粘贴的模块
import pyautogui
import time
time.sleep(2)

#从屏幕screen中找到source的位置坐标(找到微信搜索框的位置)
def findImg():
    im = pyautogui.screenshot()
    im.save('screen.png')
    screen = cv2.imread('./screen.png')
    joinMeeting = cv2.imread('./wechat.png')
    result = cv2.matchTemplate(joinMeeting,screen, cv2.TM_CCOEFF_NORMED)
    pos_start = cv2.minMaxLoc(result)[3] #获取最相似点相似坐标
    x = int(pos_start[0]) + int(joinMeeting.shape[1] / 2)
    y = int(pos_start[1]) + int(joinMeeting.shape[0] / 2)
    return x,y

#向搜索框中录入要查找的好友名称:name好友名称,x,y搜索框位置
def send_name_to_search(x,y,name):
    pyautogui.click(x,y)
    time.sleep(1)
    #赋值好友名称
    pyperclip.copy(name)
    #粘贴复制内容
    pyautogui.hotkey('command', 'v')
    time.sleep(1)
    pyautogui.hotkey('enter')
    #向下移动100个像素定位到搜索到第一个好友位置点击
#     pyautogui.moveTo(x, y+80)
#     pyautogui.click(x, y+80)

    
#向好友发送消息
def send_msg(msg):
    pyperclip.copy(msg)
    pyautogui.hotkey('command', 'v')
    pyautogui.hotkey('enter')

    
#主要程序
x,y = findImg()
send_name_to_search(x,y,'传输')
send_msg('i love learn Python!!!')
time.sleep(1)
send_msg('i love learn Python!!!') 
time.sleep(1)

send_name_to_search(x,y,'站山')
send_msg('GUI测试,无需理会')
time.sleep(1)
send_msg('GUI测试,无需理会')
  • 监视设备
import pyautogui
import cv2
import yagmail
import schedule
import time

def run():
    print('开始监视......')
    #截取屏幕图片
    myScreenshot = pyautogui.screenshot()
    myScreenshot.save(r'screen.png') 
    #基于cv2打开电脑摄像头,捕获实施照片
    cap = cv2.VideoCapture(0)
    ret, frame = cap.read()
    time.sleep(3)
    cv2.imwrite('photo.jpg', frame)
    #关闭摄像头
    cap.release()
    
    received = ['[email protected]']  
    yag = yagmail.SMTP(user='[email protected]', host='smtp.qq.com')
    contents = ['<b> <font color="#FF1493" size="10"> Bobo大人您好,一切都在监视中,尽情放心!</font> </b>',
        "screen.png",
        'photo.jpg' ]

    yag.send(received, '来自小鬼侦探的报告', contents)
    
schedule.every().minute.at(":30").do(run)
while True:
    schedule.run_pending()
    time.sleep(5)

19.BeautifulSoup

19.1 基本使用

html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
 
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
 
<p class="story">...</p>
"""
 
#基本使用:容错处理,文档的容错能力指的是在html代码不完整的情况下,使用该模块可以识别该错误。<br>#使用BeautifulSoup解析上述代码,能够得到一个 BeautifulSoup 的对象,并能按照标准的缩进格式的结构输出
from bs4 import BeautifulSoup
soup=BeautifulSoup(html_doc,'lxml') #具有容错功能
res=soup.prettify() #处理好缩进,结构化显示
print(res)

19.2 标签选择器

即直接通过标签名字选择,选择速度快,如果存在多个相同的标签则只返回第一个

from bs4 import BeautifulSoup

html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>

<p>first tag</p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie<i>this i tag</i></a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""

soup = BeautifulSoup(html_doc, 'lxml')

# 获取标签的名称
# print(soup.head)  # <head><title>The Dormouse's story</title></head>

# 获取标签的属性
# print(soup.p.name)  # p

# 直接获取标签,如果存在多个相同的标签则只返回第一个
# print(soup.p)  # <p>first tag</p>




# 获取标签的内容,

# print(soup.p.string)  # first tag
# print(soup.a.string)  # None
# print(soup.p.text)    # first tag
# print(soup.a.text)    # Elsiethis i tag
# print(soup.a.contents)  # ['Elsie', <i>this i tag</i>]
"""
注意
    contents获取选中标签内的所有的值,包括里面的标签
    string 只能获取当前标签,而无法获取子标签的内容,如果存在子标签,则返回None
    text则获取包括子标签在内的所有值
"""

# 嵌套选择
# print(soup.head.title.string)  # The Dormouse's story
# print(soup.body.a.contents)  # ['Elsie', <i>this i tag</i>]
# print(soup.body.a.text)    # Elsiethis i tag
# print(soup.body.a.string)  # None
# print(soup.body.p.string)  # first tag

# 获取子节点,子孙节点
# print(soup.contents)  # 返回整个HTML页面的所有节点
# print(soup.p.contents)  # ['first tag']
# print(soup.p.children)  # 得到一个迭代器,包含此标签内错有的子节点
# print(list(soup.a.children))  # ['Elsie', <i>this i tag</i>]
# print(soup.p.descendants)  # <generator object descendants at 0x00000162FFB9D570>
# print(list(soup.a.descendants))  # 获取子孙节点,p下所有的标签都会选择出来 ['Elsie', <i>this i tag</i>, 'this i tag']
# for i, child in enumerate(soup.p.descendants):
#     print(i, child)   # 0 first tag

# 获取父节点,祖先节点
# print(soup.a.parent)  # 获取 a 标签
# print(soup.a.parents)  # <generator object parents at 0x0000022F8747D570>
# print(list(soup.a.parents))   # a 标签的父,父,父节点都会找出来,到html节点

# 获取兄弟节点
# print(soup.a.next_siblings)  # 生成器对象 <generator object next_siblings at 0x000002418B9BD570>
# print(list(soup.a.next_siblings))

19.3 标准选择器

from bs4 import BeautifulSoup

html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>

<p>first tag</p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie<i id="i1" class="i1">this i tag</i></a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""

soup = BeautifulSoup(html_doc, 'lxml')

# 标准选择器

# 按照标签名查找
# print(soup.find_all('a'))  # 拿到所有的标签
# print(soup.find_all('a', id='link2'))  # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
# print(soup.find(id='link2'))  # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>
# print(soup.find_all(attrs={"class": "sister"}))  # 拿到所有的类为sister的a标签
# print(soup.find_all(class_='sister'))   # 拿到的结果也是所有的类名为sister的a标签
# 注意:soup.find_all(class_='sister' 中的class_ 的用法,要加下划线,因为class为关键字,写在attrs里面的没影响

# 嵌套查找
# print(soup.find_all('a')[0].find('i'))  # 拿到 a 标签的下级 i 标签 <i>this i tag</i>


# 按照属性查找
# print(soup.a.find_all(attrs={'id':'i1'}))  # [<i class="i1" id="i1">this i tag</i>]
# print(soup.a.find_all(attrs={"class":'i1'})) # [<i class="i1" id="i1">this i tag</i>]
# print(soup.find_all(id='i1'))  # [<i class="i1" id="i1">this i tag</i>]

# 按照文本内容查找,按照完全匹配来匹配内容,不是模糊的匹配,是== 不是 in
# print(soup.p.find_all(text='first tag'))  # ['first tag']

19.4 CSS选择器

##该模块提供了select方法来支持css
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title">
    <b>The Dormouse's story</b>
    Once upon a time there were three little sisters; and their names were
    <a href="http://example.com/elsie" class="sister" id="link1">
        <span>Elsie</span>
    </a>
    <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
    <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
    <div class='panel-1'>
        <ul class='list' id='list-1'>
            <li class='element'>Foo</li>
            <li class='element'>Bar</li>
            <li class='element'>Jay</li>
        </ul>
        <ul class='list list-small' id='list-2'>
            <li class='element'><h1 class='yyyy'>Foo</h1></li>
            <li class='element xxx'>Bar</li>
            <li class='element'>Jay</li>
        </ul>
    </div>
    and they lived at the bottom of a well.
</p>
<p class="story">...</p>
"""
from bs4 import BeautifulSoup
soup=BeautifulSoup(html_doc,'lxml')

#1、CSS选择器
print(soup.p.select('.sister'))
print(soup.select('.sister span'))

print(soup.select('#link1'))
print(soup.select('#link1 span'))

print(soup.select('#list-2 .element.xxx'))

print(soup.select('#list-2')[0].select('.element')) #可以一直select,但其实没必要,一条select就可以了

# 2、获取属性
print(soup.select('#list-2 h1')[0].attrs)

# 3、获取内容
print(soup.select('#list-2 h1')[0].get_text())

20.Tkinter

20.1 Tkinter中的一些基本操作

# 导入tkinter
import tkinter as tk
# 调用Tk()创建主窗口
root_window =tk.Tk()
# 给主窗口起一个名字,也就是窗口的名字
root_window.title('测试')
# 设置窗口大小:宽x高,注,此处不能为 "*",必须使用 "x"
root_window.geometry('450x300')
# 更改左上角窗口的的icon图标,加载图标(一般都存在本地然后读取!)
root_window.iconbitmap('C:/Users/Administrator/Desktop/favicon.ico')
# 设置主窗口的背景颜色,颜色值可以是英文单词,或者颜色值的16进制数,除此之外还可以使用Tk内置的颜色常量
root_window["background"] = "#C9C9C9"
#开启主循环,让窗口处于显示状态
root_window.mainloop()

20.2 Tkinter常用控件和属性

  • Tkinter中常用的15个控件
控件类型 控件名称 控件作用
Button 按钮 点击按钮时触发/执行一些事件(函数)
Canvas 画布 提供绘制图,比如直线、矩形、多边形等
Checkbutton 复选框 多项选择按钮,用于在程序中提供多项选择框
Entry 文本框输入框 用于接收单行文本输入
Frame 框架(容器)控件 定义一个窗体(根窗口也是一个窗体),用于承载其他控件,即作为其他控件的容器
Lable 标签控件 用于显示单行文本或者图片
LableFrame 容器控件 一个简单的容器控件,常用于复杂的窗口布局。
Listbox 列表框控件 以列表的形式显示文本
Menu 菜单控件 菜单组件(下拉菜单和弹出菜单)
Menubutton 菜单按钮控件 用于显示菜单项
Message 信息控件 用于显示多行不可编辑的文本,与 Label控件类似,增加了自动分行的功能
messageBox 消息框控件 定义与用户交互的消息对话框
OptionMenu 选项菜单 下拉菜单
PanedWindow 窗口布局管理组件 为组件提供一个框架,允许用户自己划分窗口空间
Radiobutton 单选框 单项选择按钮,只允许从多个选项中选择一项
Scale 进度条控件 定义一个线性“滑块”用来控制范围,可以设定起始值和结束值,并显示当前位置的精确值
Spinbox 高级输入框 Entry 控件的升级版,可以通过该组件的上、下箭头选择不同的值
Scrollbar 滚动条 默认垂直方向,鼠标拖动改变数值,可以和 Text、Listbox、Canvas等控件配合使用
Text 多行文本框 接收或输出多行文本内容
Toplevel 子窗口 在创建一个独立于主窗口之外的子窗口,位于主窗口的上一层,可作为其他控件的容器
  • 控件共有基本属性
属性名称 说明
anchor 定义控件或者文字信息在窗口内的位置
bg bg 是 background 的缩写,用来定义控件的背景颜色,参数值可以颜色的十六进制数,或者颜色英文单词
bitmap 定义显示在控件内的位图文件
borderwidth 定于控件的边框宽度,单位是像素
command 该参数用于执行事件函数,比如单击按钮时执行特定的动作,可将执行用户自定义的函数
cursor 当鼠标指针移动到控件上时,定义鼠标指针的类型,字符换格式,参数值有 crosshair(十字光标)watch(待加载圆圈)plus(加号)arrow(箭头)等
font 若控件支持设置标题文字,就可以使用此属性来定义,它是一个数组格式的参数 (字体,大小,字体样式)
fg fg 是 foreground 的缩写,用来定义控件的前景色,也就是字体的颜色
height 该参数值用来设置控件的高度,文本控件以字符的数目为高度(px),其他控件则以像素为单位
image 定义显示在控件内的图片文件
justify 定义多行文字的排列方式,此属性可以是 LEFT/CENTER/RIGHT
padx/pady 定义控件内的文字或者图片与控件边框之间的水平/垂直距离
relief 定义控件的边框样式,参数值为FLAT(平的)/RAISED(凸起的)/SUNKEN(凹陷的)/GROOVE(沟槽桩边缘)/RIDGE(脊状边缘)
text 定义控件的标题文字
state 控制控件是否处于可用状态,参数值默认为 NORMAL/DISABLED,默认为 NORMAL(正常的)
width 用于设置控件的宽度,使用方法与 height 相同

20.3 Tkinter主窗口

  • 创建一个空白窗口
# 导入tk
from tkinter import *
# 创建一个主窗口对象
window = Tk()
# 调用mainloop()显示主窗口
window.mainloop()
  • 窗口常用方法

下表列出了窗口的常用方法,其中 window 代表主窗口对象:

函数 说明
window.title("my title") 接受一个字符串参数,为窗口起一个标题
window.resizable() 是否允许用户拉伸主窗口大小,默认为可更改,当设置为 resizable(0,0)或者resizable(False,False)时不可更改
window.geometry() 设定主窗口的大小以及位置,当参数值为 None 时表示获取窗口的大小和位置信息。
window.quit() 关闭当前窗口
window.update() 刷新当前窗口
window.mainloop() 设置窗口主循环,使窗口循环显示(一直显示,指导窗口被关闭)
window.iconbitmap() 设置窗口左上角的图标(图标是.ico文件类型)
window.config(background ="red") 设置窗口的背景色为红色,也可以接受 16 进制的颜色值
window.minsize(50,50) 设置窗口被允许调整的最小范围,即宽和高各50
window.maxsize(400,400) 设置窗口被允许调整的最大范围,即宽和高各400
window.attributes("-alpha",0.5) 用来设置窗口的一些属性,比如透明度(-alpha)、是否置顶(-topmost)即将主屏置于其他图标之上、是否全屏(-fullscreen)全屏显示等
window.state("normal") 用来设置窗口的显示状态,参数值 normal(正常显示),icon(最小化),zoomed(最大化),
window.withdraw() 用来隐藏主窗口,但不会销毁窗口。
window.iconify() 设置窗口最小化
window.deiconify() 将窗口从隐藏状态还原
window.winfo_screenwidth() window.winfo_screenheight() 获取电脑屏幕的分辨率(尺寸)
window.winfo_width() window.winfo_height() 获取窗口的大小,同样也适用于其他控件,但是使用前需要使用 window.update() 刷新屏幕,否则返回值为1
window.protocol("协议名",回调函数) 启用协议处理机制,常用协议有 WN_DELETE_WINDOW,当用户点击关闭窗口时,窗口不会关闭,而是触发回调函数。
  • 示例
import tkinter as tk
window =tk.Tk()
#设置窗口title
window.title('C语言中文网')
#设置窗口大小:宽x高,注,此处不能为 "*",必须使用 "x"
window.geometry('450x300')
# 获取电脑屏幕的大小
print("电脑的分辨率是%dx%d"%(window.winfo_screenwidth(),window.winfo_screenheight()))
# 要求窗口的大小,必须先刷新一下屏幕
window.update()
print("窗口的分辨率是%dx%d"%(window.winfo_width(),window.winfo_height()))
# 如使用该函数则窗口不能被拉伸
# window.resizable(0,0)
# 改变背景颜色
window.config(background="#6fb765")
# 设置窗口处于顶层
window.attributes('-topmost',True)
# 设置窗口的透明度
window.attributes('-alpha',1)
# 设置窗口被允许最大调整的范围,与resizble()冲突
window.maxsize(600,600)
# 设置窗口被允许最小调整的范围,与resizble()冲突
window.minsize(50,50)
#更改左上角窗口的的icon图标,加载C语言中文网logo标
window.iconbitmap('C:/Users/Administrator/Desktop/favicon.ico')
#添加文本内容,并对字体添加相应的格式 font(字体,字号,"字体类型")
text=tk.Label(window,text="C语言中文网,网址:c.biancheng.net",bg="yellow",fg="red",font=('Times', 15, 'bold italic underline'))
#将文本内容放置在主窗口内
text.pack()
# 添加按钮,以及按钮的文本,并通过command 参数设置关闭窗口的功能
button=tk.Button(window,text="关闭",command=window.quit)
# 将按钮放置在主窗口内
button.pack(side="bottom")
#进入主循环,显示主窗口
window.mainloop()

image-20220511211010480

  • protocol协议处理机制

Tinter 除了提供事件绑定机制之外,还提供了协议处理机制,它指的是应用程序和窗口管理器之间的交互,最常用的协议为 WM_DELETE_WINDOW。

当 Tkinter 使用 WM_DELETE_WINDOW 协议与主窗口进行交互时,Tkinter 主窗口右上角x号的关闭功能失效,也就是无法通过点击x来关闭窗口,而是转变成调用用户自定义的函数。

  • 示例
from tkinter import Tk
# 导入 对话框控件
from tkinter import messagebox
# 创建主窗口
root = Tk()
# 定义回调函数,当用户点击窗口x退出时,执行用户自定义的函数
def QueryWindow():
    # 显示一个警告信息,点击确后,销毁窗口
    if messagebox.showwarning("警告","出现了一个错误"):
        # 这里必须使用 destory()关闭窗口
        root.destroy()
# 使用协议机制与窗口交互,并回调用户自定义的函数
root.protocol('WM_DELETE_WINDOW', QueryWindow)
root.mainloop()

image-20220511211305043

通过封装函数的形式来执行相应的 GUI 控件功能,这在学习 Tkinter 编程的整个过程中非常常见,比如 Button 控件的command参数也可以执行回调函数,如下所示:

import tkinter as tk
# 定义窗口
window = tk.Tk()
window.title('c语言中文网')
window.geometry('300x300')
window.iconbitmap('C:/Users/Administrator/Desktop/favicon.ico')
# 定义回调函数
def callback():
 print("执行回调函数","C语言中文网欢迎您")
# 点击执行按钮
button = tk.Button(window, text="执行", command=callback)
button.pack()
window.mainloop()

点击窗口内的“执行”按钮,运行结果如下:

执行回调函数 C语言中文网欢迎您
  • 设置窗的位置

当我们运行 Tkinter 程序时,主窗口都会出现在距离屏幕左上角指定的位置上,这是由 Tkinter 软件包默认设置的。但是在许多情况下,我们需要根据实际情况来移动窗口在电脑屏幕上的位置,这时应该如何处理呢?其实很简单,通过窗口对象的 geometry() 方法即可改变主窗口的位置,其语法格式如下:

geometry('450x400+300+200')

上述代码表示,设置主窗口的宽度为 450,高度为 400,同时窗口距离左边屏幕的距离为 300(以像素为单位),距离屏幕顶部的距离为 200,这里我们将带“+”的参数值称为“位置参数”,当然,您也可以将它们设置为负数,如下所示:

geometry('+-1500+-2000')

当设置了一个超过屏幕的负参数值时,主窗口会被移动至“屏幕之外”,此时就看不到主窗口了,这也是隐藏窗口的一种方法。

下面看一组简单的示例:

import tkinter as tk
window = tk.Tk()
window.title('c语言中文网')
window.iconbitmap('C:/Users/Administrator/Desktop/favicon.ico')
# 设置窗口大小变量
width = 300
height = 300
# 窗口居中,获取屏幕尺寸以计算布局参数,使窗口居屏幕中央
screenwidth = window.winfo_screenwidth()
screenheight = window.winfo_screenheight()
size_geo = '{}x{}+{}+{}'.format(width, height, int((screenwidth-width)/2), int((screenheight-height)/2))
window.geometry(size_geo)
window.mainloop()

image-20220511211638456

20.4 Tkinter Label标签控件

  • Label(标签)的常用属性
属性名称 说明
anchor 控制文本(或图像)在 Label 中显示的位置(方位),通过方位的英文字符串缩写(n、ne、e、se、s、sw、w、nw、center)实现定位,默认为居中(center)
bg 用来设置背景色
bd 即 borderwidth 用来指定 Label 控件的边框宽度,单位为像素,默认为 2 个像素
bitmap 指定显示在 Label 控件上的位图,若指定了 image 参数,则该参数会被忽略
compound 控制 Lable 中文本和图像的混合模式,若选项设置为 CENTER,则文本显示在图像上,如果将选项设置为 BOTTOM、LEFT、RIGHT、TOP,则图像显示在文本旁边。
cursor 指定当鼠标在 Label 上掠过的时候,鼠标的的显示样式,参数值为 arrow、circle、cross、plus
disableforeground 指定当 Label 设置为不可用状态的时候前景色的颜色
font 指定 Lable 中文本的 (字体,大小,样式)元组参数格式,一个 Lable 只能设置一种字体
fg 设置 Label 的前景色
height/width 设置 Lable 的高度/宽度,如果 Lable 显示的是文本,那么单位是文本单元,如果 Label 显示的是图像,那么单位就是像素,如果不设置,Label 会自动根据内容来计算出标签的高度
highlightbackground 当 Label 没有获得焦点的时候高亮边框的颜色,系统的默认是标准背景色
highlightcolor 指定当 Lable 获得焦点的话时候高亮边框的颜色,系统默认为0,不带高亮边框
image 指定 Label 显示的图片,一般是 PhotoImage、BitmapImage 的对象
justify 表示多行文本的对齐方式,参数值为 left、right、center,注意文本的位置取决于 anchor 选项
padx/pady padx 指定 Label 水平方向上的间距(即内容和边框间),pady 指定 Lable 水平方向上的间距(内容和边框间的距离)
relief 指定边框样式,默认值是 "flat",其他参数值有 "groove"、"raised"、"ridge"、"solid"或者"sunken"
state 该参数用来指定 Lable 的状态,默认值为"normal"(正常状态),其他可选参数值有"active"和"disabled"
takefocus 默认值为False,如果是 True,表示该标签接受输入焦点
text 用来指定 Lable 显示的文本,注意文本内可以包含换行符
underline 给指定的字符添加下划线,默认值为 -1 表示不添加,当设置为 1 时,表示给第二个文本字符添加下划线。
wraplength 将 Label 显示的文本分行,该参数指定了分行后每一行的长度,默认值为 0
  • Label控件构成

一个控件主要由背景和前景两部分组成。其中背景由三部分构成分别是内容区域、填充区、边框,这三个区域的大小通过以下属性进行控制,如下所示:

  • width/height
  • padx/pady
  • borderwidth

image-20220511212031860

边框的宽度可以通过 borderwidth 来调整,其样式可以通过relief来设置(默认为平的 flat);填充区的大小调整分为水平方向和垂直方向,可以使用padxpady来调整;内容区则主要用来显示文字或者图片,其大小由 width/height 来控制。

  • 示例
import tkinter as tk
win = tk.Tk()
win.title("C语言中文网")
win.geometry('400x200')
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
# 若内容是文字则以字符为单位,图像则以像素为单位
label = tk.Label(win, text="网址:c.biancheng.net",font=('宋体',20, 'bold italic'),bg="#7CCD7C",
               # 设置标签内容区大小
               width=30,height=5,
               # 设置填充区距离、边框宽度和其样式(凹陷式)
               padx=10, pady=15, borderwidth=10, relief="sunken")
label.pack()
win.mainloop()

image-20220511212334879

  • 标签添加背景图

Label(标签)除了可以显示文本之外,还可以用来显示图片,通过一组示例做简单的说明,代码如下所示:

import tkinter as  tk
win = tk.Tk()
win.title("C语言中文网")
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
#显示图片(注意这里默认支持的图片格式为GIF)
photo = tk.PhotoImage(file = 'C:/Users/Administrator/Desktop/c.biancheng.gif')
print(type(photo))
# 将图片放在主窗口的右边
lab =tk.Label(win,image=photo).pack(side="right")
# 显示文字,设置文本格式
text = "C语言中文网欢迎您,\n"\
    "这里有精彩的教程,\n "\
    "这里有数不尽的知识宝藏"
lab_text =tk.Label(win,text=text,fg ='#7CCD7C',font=('微软雅黑',15,'italic'),justify='left',padx=10).pack(side='left')
win.mainloop()

image-20220511212410185

  • Message控件

Message 控件与 Label 控件的功能类似,它主要用来显示多行不可编辑的文本信息,与 Label 的不同之处在于该控件增加了自动分行的功能。下面对它做简单的介绍,示例如下:

from tkinter import *
#创建主窗口
win = Tk()
win.config(bg='#8DB6CD')
win.title("C语言中文网")
win.geometry('400x300')
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
txt = "C语言中文网,网址是:c.biancheng.net"
msg = Message (win, text=txt,width =60,font=('微软雅黑',10,'bold'))
msg .pack (side=LEFT)
#开始程序循环
win .mainloop ()

image-20220511213021628

20.5 Tkinter Button按钮控件

  • Button常见属性
属性 说明
anchor 控制文本所在的位置,默认为中心位置(CENTER)
activebackground 当鼠标放在按钮上时候,按妞的背景颜色
activeforeground 当鼠标放在按钮上时候,按钮的前景色
bd 按钮边框的大小,默认为 2 个像素
bg 按钮的背景色
command 用来执行按钮关联的回调函数。当按钮被点击时,执行该函数
fg 按钮的前景色
font 按钮文本的字体样样式
height 按钮的高度
highlightcolor 按钮控件高亮处要显示的颜色
image 按钮上要显示的图片
justify 按钮显示多行文本时,用来指定文本的对齐方式,参数值有 LEFT/RIGHT/CENTER
padx/pady padx 指定 x 轴(水平方向)的间距大小,pady 则表示 y轴(垂直方向)的间距大小
ipadx/ipady ipadx 指标签文字与标签容器之间的横向距离;ipady 则表示标签文字与标签容器之间的纵向距离
state 设置按钮的可用状态,可选参数有NORMAL/ACTIVE/DISABLED,默认为 NORMAL
text 按钮控件要显示的文本
  • 简单的示例
import tkinter as tk
from tkinter import messagebox
window = tk.Tk()
# 设置窗口的标题
window.title('C语言中文网')
# 设置窗口的大小
window.geometry('400x300+300+200')
# 当按钮被点击的时候执行click_button()函数
def click_button():
 # 使用消息对话框控件,showinfo()表示温馨提示
 messagebox.showinfo(title='温馨提示', message='欢迎使用C语言中文网')
# 创建图片对象
im = tk.PhotoImage(file='C:/Users/Administrator/Desktop/按钮.gif')
# 通过image参数传递图片对象
button = tk.Button(window,image=im,command=click_button).pack()
# 启动窗口
window.mainloop()

image-20220512162250856

  • 拓展:按钮的布局

按钮在主窗口中的布局,通常使用 grid() 函数来完成,该函数以网格状的形式(即行和列)来管理窗口的布局。

grid() 布局管理器提供了一个sticky参数,通过该参数可以设置按钮的方位,该参数默认将控件设置居中,其他参数值有 N/S/W/E(上/下/左/右),而且可以组合在一起使用,比如 NW/WE/SE/SW/NE 等,这与anchor参数控制文本的显示位置,有着异曲同工之妙。如下图所示:

image-20220512162412081

注意:值得大家注意的是 grid() 布局方法不能与 pack() 混合在一起使用。

  • 示例
import tkinter as tk
from tkinter import messagebox
win = tk.Tk()
win.title("C语言中文网")
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
win.geometry('400x200+100+100')
win.resizable(0,0)
# 将俩个标签分别布置在第一行、第二行
tk.Label(win, text="账号:").grid(row=0)
tk.Label(win, text="密码:").grid(row=1)
# 创建输入框控件
e1 = tk.Entry(win)
# 以 * 的形式显示密码
e2 = tk.Entry(win,show='*')
e1.grid(row=0, column=1, padx=10, pady=5)
e2.grid(row=1, column=1, padx=10, pady=5)
# 编写一个简单的回调函数
def login():
    messagebox.showinfo('欢迎您到来')
# 使用 grid()的函数来布局,并控制按钮的显示位置
tk.Button(win, text="登录", width=10, command=login).grid(row=3, column=0, sticky="w", padx=10, pady=5)
tk.Button(win, text="退出", width=10, command=win.quit).grid(row=3, column=1, sticky="e", padx=10, pady=5)
win.mainloop()

image-20220512162502743

20.6 Tkinter Entry输入控件

  • Entry的基本属性
属性名称 说明
exportselection 默认情况下,如果在输入框中选中文本会复制到粘贴板,如果要忽略这个功能,可以设置为 exportselection=0
selectbackground 选中文字时的背景颜色
selectforeground 选中文字时的前景色
show 指定文本框内容以何种样式的字符显示,比如密码可以将值设为 show="*"
textvariable 输入框内值,也称动态字符串,使用 StringVar() 对象来设置,而 text 为静态字符串对象
xscrollcommand 设置输入框内容滚动条,当输入的内容大于输入框的宽度时使用户
  • 动态数据类型

上述表格中提及了 StringVar() 方法,和其同类的方法还有 BooleanVar()、DoubleVar()、IntVar() 方法,不难看出他们分别代表一种数据类型,即字符串、布尔值、浮点型、整型,这些方法并不属于 Python 内置方法,而是 Tkinter 特有的方法。

在界面编程的过程中,有时我们需要“动态跟踪”一些变量值的变化,从而保证值的变换及时的反映到显示界面上,但是 Python 内置的数据类型是无法这一目的的,因此使用了 Tcl 内置的对象,我们把这些方法创建的数据类型称为“动态类型”,比如 StringVar() 创建的字符串,称为“动态字符串”。

  • 示例
import tkinter as tk
import time
root = tk.Tk()
root.title("C语言中文网")
root.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
root.geometry('450x150+100+100')
root.resizable(0,0)
root.title('我们的时钟')
# 获取时间的函数
def gettime():
    # 获取当前时间
    dstr.set(time.strftime("%H:%M:%S"))
    # 每隔 1s 调用一次 gettime()函数来获取时间
    root.after(1000, gettime)
# 生成动态字符串
dstr = tk.StringVar()
# 利用 textvariable 来实现文本变化
lb = tk.Label(root,textvariable=dstr,fg='green',font=("微软雅黑",85))
lb.pack()
# 调用生成时间的函数
gettime()
# 显示窗口
root.mainloop()
  • 常用方法
方法 说明
delete() 根据索引值删除输入框内的值
get() 获取输入框内的是
set() 设置输入框内的值
insert() 在指定的位置插入字符串
index() 返回指定的索引值
select_clear() 取消选中状态
select_adujst() 确保输入框中选中的范围包含 index 参数所指定的字符,选中指定索引和光标所在位置之前的字符
select_from (index) 设置一个新的选中范围,通过索引值 index 来设置
select_present() 返回输入框是否有处于选中状态的文本,如果有则返回 true,否则返回 false。
select_to() 选中指定索引与光标之间的所有值
select_range() 选中指定索引与光标之间的所有值,参数值为 start,end,要求 start 必须小于 end。

注意:在 Entry 控件中,我们可以通过以下方式来指定字符的所在位置:

  • 数字索引:表示从 0 开始的索引数字;

  • "ANCHOE":在存在字符的情况下,它对应第一个被选中的字符;

  • "END":对应已存在文本中的最后一个位置;

  • "insert(index,'字符'):将字符插入到 index 指定的索引位置。

  • 示例

import tkinter as tk
win = tk.Tk()
# 设置主窗口
win.geometry('250x100')
win.title("C语言中文网")
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
win.resizable(0,0)
# 创建输入框控件
entry1 = tk.Entry(win)
# 放置输入框,并设置位置
entry1.pack(padx=20, pady=20)
entry1.delete(0, "end")
# 插入默认文本
entry1.insert(0,'C语言中文网,网址:c.biancheng.net')
# 得到输入框字符串
print(entry1.get())
# 删除所有字符
# entry1.delete(0, tk.END)
win.mainloop()

image-20220512163213480

  • 输入账号密码的示例
import tkinter as tk
win =tk.Tk()
# 设置主窗口
win.geometry('250x100')
win.title("C语言中文网")
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
win.resizable(0,0)
# 新建文本标签
labe1 = tk.Label(win,text="账号:")
labe2 = tk.Label(win,text="密码:")
# grid()控件布局管理器,以行、列的形式对控件进行布局,后续会做详细介绍
labe1.grid(row=0)
labe2.grid(row=1)
# 为上面的文本标签,创建两个输入框控件
entry1 = tk.Entry(win)
entry2 = tk.Entry(win)
# 对控件进行布局管理,放在文本标签的后面
entry1.grid(row=0, column=1)
entry2.grid(row=1, column=1)
# 显示主窗口
win.mainloop()

image-20220512163330594

  • Entry控件验证功能
参数 说明
validate 指定验证方式,字符串参数,参数值有 focus、focusin、focusout、key、all、none。
validatecommand 指定用户自定义的验证函数,该函数只能返回 True 或者 Fasle
invalidcommand 当 validatecommand 指定的验证函数返回 False 时,可以使用该参数值再指定一个验证函数。
  • validate 的参数值的介绍
参数值 说明
focus 当 Entry 组件获得或失去焦点的时候验证
focusin 当 Entry 组件获得焦点的时候验证
focuson 当 Entry 组件失去焦点的时候验证
key 当输入框被编辑的时候验证
all 当出现上边任何一种情况的时候验证
none 默认不启用验证功能,需要注意的是这里是字符串的 'none'
  • 运行实例
import tkinter as tk
from tkinter import messagebox
win = tk.Tk()
# 设置主窗口
win.geometry('250x200+250+200')
win.title("C语言中文网")
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
win.resizable(0,0)
# 创建验证函数
def check():
    if entry1.get() == "C语言中文网":
        messagebox.showinfo("输入正确")
        return True
    else:
        messagebox.showwarning("输入不正确")
        entry1.delete(0,tk.END)
        return False
# 新建文本标签
labe1 = tk.Label(win,text="账号:")
labe2 = tk.Label(win,text="密码:")
labe1.grid(row=0)
labe2.grid(row=1)
# 创建动字符串
Dy_String = tk.StringVar()
# 使用验证参数 validata,参数值为 focusout 当失去焦点的时候,验证输入框内容是否正确
entry1 = tk.Entry(win,textvariable =Dy_String,validate ="focusout",validatecommand=check)
entry2 = tk.Entry(win)
# 对控件进行布局管理,放在文本标签的后面
entry1.grid(row=0, column=1)
entry2.grid(row=1, column=1)
win.mainloop()

image-20220512163634745

不仅如此,Tkinter 还为验证函数提供可一些额外的选项,不过想要使用这些额外选项,需要提前使用 register() 方法对验证函数进行注册。常用的选项如下所示:

选项 说明
%d 有 3 个参数值,其中 0 表示删除操作;1 表示插入操作;2 表示获得、失去焦点或 textvariable 变量的值被修改导
%i 当用户进行插入或者删除操作的时,该选项不爱哦是插入或者删除的索引位置,若是其他的情况则选项值为 -1
%P 该选项值指定了输入框内的文本内容,只有当输入框的值允许改变的时候,该选项值才会生效。
%s 改值为调用验证函数钱输入框内的文本内容
%S 该选项值,只有插入或者删除操作触发验证函数的时候才会生效,它表示了被删除或者插入的内容
%v 表示当前 Entry 控件的 validate 参数的值
%V 表示触发验证函数的原因,值为 focus、focusin 、focusout、all、key.. 中的一个。
%W 该选项表示控件类型,即控件的名字(Entry)
  • 实例
import tkinter as tk
from tkinter import messagebox
win = tk.Tk()
# 设置主窗口
win.geometry('250x200+250+200')
win.title("C语言中文网")
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
win.resizable(0,0)
# 新建文本标签
labe1 = tk.Label(win,text="账号:")
labe2 = tk.Label(win,text="密码:")
labe1.grid(row=0)
labe2.grid(row=1)
# 创建动字符串
Dy_String = tk.StringVar()
# 创建验证函数
def check(strings,reason, id):
  if entry1.get() == "C语言中文网":
      messagebox.showinfo("输入正确")
      print(strings,reason,id)
      return True
  else:
      messagebox.showwarning("输入不正确")
      print(strings,reason,id)
      return False
# 对验证函数进行注册
CheckTest = win.register(check)
# 使用验证参数 validata,参数值为 focusout 当失去焦点的时验证输入框内容是否正确
entry1 = tk.Entry(win,textvariable =Dy_String,validate ="focusout",validatecommand=(CheckTest,'%P','%V','%W'))
entry2 = tk.Entry(win)
# 对控件进行布局管理,放在文本标签的后面
entry1.grid(row=0, column=1)
entry2.grid(row=1, column=1)
win.mainloop()

image-20220512163958197

  • Spinbox 高级输入框

Spinbox 是 Entry 控件的升级版,它是 Tkinter 8.4 版本后新增的控件,该控件不仅允许用户直接输入内容,还支持用户使用微调选择器(即上下按钮调节器)来输入内容。在一般情况下,Spinbox 控件用于在固定的范围内选取一个值的时候使用。下面看一组简单的应用示例:

import tkinter as tk
root = tk.Tk()
root.title("C语言中文网")
root.geometry('300x200+300+300')
root.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
# 如果是数字使用 from_和to参数,范围 0-20,并且与2步长递增或递减
w = tk.Spinbox(root,from_=0,to=20, increment=2,width = 15,bg='#9BCD9B')
w.pack()
# 显示窗口
root.mainloop()

image-20220512164140991

若不是数字,而是字符串形式的选项值,则采用values参数以元组的形式进行传参,如下所示:

import tkinter as tk
root = tk.Tk()
root.title("C语言中文网")
root.geometry('300x200+300+300')
root.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
# 使用 values 参数以元组的形式进行传参
strings = tk.Spinbox(root,values=('Python','java','C语言','PHP'))
strings.pack()
# 开启事件循环
root.mainloop()

image-20220512164213833

20.7 Tkinter Text文本框控件

  • Text的基本属性
属性 说明
autoseparators 默认为 True,表示执行撤销操作时是否自动插入一个“分隔符”(其作用是用于分隔操作记录)
exportselection 默认值为 True,表示被选中的文本是否可以被复制到剪切板,若是 False 则表示不允许。
insertbackground 设置插入光标的颜色,默认为 BLACK
insertborderwidth 设置插入光标的边框宽度,默认值为 0
insertofftime 该选项控制光标的闪烁频频率(灭的状态)
insertontime 该选项控制光标的闪烁频频率(亮的状态)
selectbackground 指定被选中文本的背景颜色,默认由系统决定
selectborderwidth 指定被选中文本的背景颜色,默认值是0
selectforeground 指定被选中文本的字体颜色,默认值由系统指定
setgrid 默认值是 False,指定一个布尔类型的值,确定是否启用网格控制
spacing1 指定 Text 控件文本块中每一行与上方的空白间隔,注意忽略自动换行,且默认值为 0。
spacing2 指定 Text 控件文本块中自动换行的各行间的空白间隔,忽略换行符,默认值为0
spacing3 指定 Text 组件文本中每一行与下方的空白间隔,忽略自动换行,默认值是 0
tabs 定制 Tag 所描述的文本块中 Tab 按键的功能,默认被定义为 8 个字符宽度,比如 tabs=('1c', '2c', '8c') 表示前 3 个 Tab 宽度分别为 1厘米,2厘米,8厘米。
undo 该参数默认为 False,表示关闭 Text 控件的“撤销”功能,若为 True 则表示开启
wrap 该参数用来设置当一行文本的长度超过 width 选项设置的宽度时,是否自动换行,参数值 none(不自动换行)、char(按字符自动换行)、word(按单词自动换行)
xscrollcommand 该参数与 Scrollbar 相关联,表示沿水平方向上下滑动
yscrollcommand 该参数与 Scrollbar 相关联,表示沿垂直方向左右滑动
  • 基本方法
方法 说明
bbox(index) 返回指定索引的字符的边界框,返回值是一个 4 元组,格式为(x,y,width,height)
edit_modified() 该方法用于查询和设置 modified 标志(该标标志用于追踪 Text 组件的内容是否发生变化)
edit_redo() “恢复”上一次的“撤销”操作,如果设置 undo 选项为 False,则该方法无效。
edit_separator() 插入一个“分隔符”到存放操作记录的栈中,用于表示已经完成一次完整的操作,如果设置 undo 选项为 False,则该方法无效。
get(index1, index2) 返回特定位置的字符,或者一个范围内的文字。
image_cget(index, option) 返回 index 参数指定的嵌入 image 对象的 option 选项的值,如果给定的位置没有嵌入 image 对象,则抛出 TclError 异常
image_create() 在 index 参数指定的位置嵌入一个 image 对象,该 image 对象必须是 Tkinter 的 PhotoImage 或 BitmapImage 实例。
insert(index, text) 在 index 参数指定的位置插入字符串,第一个参数也可以设置为 INSERT,表示在光标处插入,END 表示在末尾处插入。
delete(startindex [, endindex]) 删除特定位置的字符,或者一个范围内的文字。
see(index) 如果指定索引位置的文字是可见的,则返回 True,否则返回 False。
  • 使用例子
from tkinter import *
win = Tk()
win.title("C语言中文网")
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
win.geometry('400x300')
# 创建一个文本控件
# width 一行可见的字符数;height 显示的行数
text = Text(win, width=50, height=20, undo=True, autoseparators=False)
text.grid()
# INSERT 光标处插入;END 末尾处插入
text.insert(INSERT, 'C语言中文网,一个有温度的网站')
# 定义撤销和恢复方法,调用edit_undo()和 edit_redo()方法
def backout():
    text.edit_undo()
def regain():
    text.edit_redo()
# 定义撤销和恢复按钮
Button(win,text = '撤销',command = backout).grid(row=3, column=0, sticky="w", padx=10, pady=5)
Button(win,text = '恢复',command = regain).grid(row=3, column=0, sticky="e", padx=10, pady=5)
win.mainloop()

image-20220512164554599

注意:点击“撤销”按钮后输入的所有语句都会被删除,如果再点击“恢复”按钮,刚刚删除的内容又会恢复。

文本控件(Text)支持三种类型的特殊结构,即 Mark、Tag 以及 Index,每一种结构都有相应的方法,下面对这些结构做相关的介绍。

Index文本索引

Index 索引,用于指定字符在文本中的真实位置,这与我们经常使用 Python 索引是一样的,不过在 Text 文本控件中,两者之间的使用形式存在一些差异。

索引类型 说明
INSERT 对应插入光标的位置
CURRENT 对应与鼠标坐标最接近的位置
END 对应 Text 控件的文本域中最后一个字符的下一个位置
"line.column" 表示某一行某一列的一个位置,比如 1.2 表示第一行第二列的一个位置
"line.end" 表示某一行到末尾的最后一个位置
SEL 一种针对于 Tag 的特殊索引用法,(SEL_FIRST,SEL_LAST) 表示当前被选中的范围
  • 示例
from tkinter import *
root = Tk()
root.title("C语言中文网")
root.geometry('400x200')
root.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
text =Text(root, width=35, heigh=15)
text.pack()
# 在文本域中插入文字
text.insert(INSERT, 'C语言中文网')
# 继续向后插入文字
text.insert("insert", ",I love Python")
# 获取字符,使用get() 方法
print(text.get("1.3", "1.end"))
# 显示窗口
root.mainloop()

image-20220512164848457

Tag文本标签

Tag(标签)用来给一定范围内的文字起一个标签名,通过该标签名就能操控某一范围内的文字,比如修改文本的字体、尺寸和颜色。除此之外,该标签还可以和事件函数绑定在一起使用。

这里需要注意,Tags 的名字是由字符串组成的,但不能是空白字符串。

  • 常见方法
方法 说明
tag_add(tagName,index1,index2) 为指定索引范围内的内容添加一个标签名字,如果 index2 不存在,则单独为 Index1 指定的内容添加 Tag
tag_bind(tagName, sequence, func, add=None) 为 Tag 绑定事件,解除绑定使用 tag_unbind() 方法
tag_cget(tagName,option) 返回 tagName 指定的 option 选项的值
tag_configure(tagName, cnf=None, **kw) 设置 tagName 的选项
tag_delete(tagNames) 删除单个或者多个 tagNames 指定的标签
tag_lower(tagName, belowThis=None) 降低 Tag 的优先级,如果 belowThis 参数不为空,则表示 tagName 需要比 belowThis 指定的 Tag 优先级更低
tag_names(index=None) 如果不带参数,表示返回 Text 组件中所有 Tags 的名字,若存在 index 参数则返回该位置上所有 Tags 的名字
tag_nextrange(tagName, index1, index2=None) 在 index1 到 index2 的范围内第一个 tagName 的位置,若不存在则返回空字符串。
tag_raise(tagName, aboveThis=None) 提高 Tag 的优先级,如果 aboveThis 参数不为空,则表示 tagName 需要比 aboveThis 指定的 Tag 优先级更高
tag_ranges(tagName) 返回所有 tagName 指定的文本,并将它们的范围以列表的形式返回
tag_remove(tagName, index1, index2=None) 删除 index1 到 index2 之间所有的 tagName,如果忽略 index2 参数,那么只删除 index1 指定字符的 tagName
  • 示例
from tkinter import *
# 创建多行文本框控件
from tkinter import *
# 创建主窗口
win = Tk()
win.title(string = "C语言中文网")
# 创建一个Text控件
text = Text (win)
# 在Text控件内插入- -段文字 ,INSERT表示在光标处插入,END表示在末尾处插入
text.insert (INSERT,  "C语言中文网(网址:c.biancheng.net),一个有温度的网站,一生只做一件事\n\n")
# 跳下一行
text.insert (INSERT, "\n\n")
# 在Text控件内插入- -个按钮
button = Button(text, text="关闭",command=win.quit)
text. window_create (END, window=button)
# 填充水平和垂直方向,这里设置 expand为 True 否则不能垂直方向延展
text .pack (fill=BOTH,expand=True)
# 在第一行文字的第0个字符到第6个字符处插入标签,标签名称为"name"
text.tag_add("name", "1.0", "1.6")
# 将插入的按钮设置其标签名为"button"
text.tag_add ("button", button)
#使用 tag_config() 来改变标签"name"的前景与背景颜色,并加下画线,通过标签控制字符的样式
text.tag_config("name", font=('微软雅黑',18,'bold'),background="yellow", foreground= "blue",underline=1)
#设置标签"button"的居中排列
text. tag_config("button", justify="center")
#开始程序循环
win .mainloop()

image-20220512165119503

Mark文本标记

Mark(标记)通常被用来当作书签,它可以帮助用户快速找到内容的指定位置,并且跟随相应的字符一起移动。

Mark 有两种类型的标记,分别是“INSERT”和“CURRENT”,其含义如下:

  • INSERT:指定当前插入光标的位置,Tkinter 会在该位置绘制一个闪烁的光标;
  • CURRENT:用于指定当前光标所处坐标最邻近的位置。

它们是 Tkinter 中预定义的标记,因此不能被删除。除此上述标记外,我们还可以通过 user-define marks(用户自定义标记) 的方式来自定义 Mark。Tkinter 也提供了一些有关 Mark 的常用的方法,如下所示:

方法 说明
mark_gravity(markName, direction=None) 设置 Mark 的移动方向,默认是 "right",也可以设置为 "left" ,表示即如果在 Mark 处插入文本的话,Mark 的标记移动方向,也就是文本的插入方向。
mark_names() 返回 Text 组件中所有 Marks 的名字
mark_next(index) 返回在 index 指定的位置后边的一个 Mark 的名字
mark_previous(index) 返回在 index 指定的位置前边的一个 Mark 的名字
mark_set(markName, index) 移动 Mark 到 index 参数指定的位置,如果 markName 参数指定的 Mark 不存在,则创建一个新的 Mark
mark_unset(MarkName) 删除指定的 Mark

注意:如果在 Mark 标记的位置之前插入或删除文本,那么 Mark 跟着一起移动。如果要删除 Mark 需要使用 mark_unset() 方法,但是只会删除 Mark 周围的文本,并不会删除 Mark 标记本身。

  • 示例
import tkinter as tk
root = tk.Tk()
root.title("C语言中文网")
root.geometry('400x200')
root.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
text = tk.Text(root, width=35, heigh=15)
text.pack()
text.insert("insert", "C语言中文网")
# 设置标记,这里的 1.end 表示 第一行最后一个字符,当然也可以使用数字来表示比如 1.5 表示第一行第五个字符
text.mark_set("name", "1.end")
# 在标记之后插入相应的文字
text.insert("name", ",网址:c.biancheng.net")
# 跟着自动移动,往后插入,而不是停留在原位置
text.insert("name", ",欢迎光临")
# 若使用 mark_unset() 可以删除指定的标记
# text.mark_unset("name")
# 但使用delete来清楚所有的内容, mark 标记依旧会存在
# text.delete("1.0","end")
# 依然可以使用 name标记来插入
# text.insert("name", "Python答疑")
# 显示窗口
root.mainloop()

image-20220512165259188

20.8 Tkinter列表框和组合框控件

  • Listbox控件(列表框)

  • 常用方法

方法 说明
activate(index) 将给定索引号对应的选项激活,即文本下方画一条下划线
bbox(index) 返回给定索引号对应的选项的边框,返回值是一个以像素为单位的 4 元祖表示边框:(xoffset, yoffset, width, height), xoffset 和 yoffset 表示距离左上角的偏移位置
curselection() 返回一个元组,包含被选中的选项序号(从 0 开始)
delete(first, last=None) 删除参数 first 到 last 范围内(包含 first 和 last)的所有选项
get(first, last=None) 返回一个元组,包含参数 first 到 last 范围内(包含 first 和 last)的所有选项的文本
index(index) 返回与 index 参数相应选项的序号
itemcget(index, option) 获得 index 参数指定的项目对应的选项(由 option 参数指定)
itemconfig(index, **options) 设置 index 参数指定的项目对应的选项(由可变参数 **option 指定)
nearest(y) 返回与给定参数 y 在垂直坐标上最接近的项目的序号
selection_set(first, last=None) 设置参数 first 到 last 范围内(包含 first 和 last)选项为选中状态,使用 selection_includes(序号) 可以判断选项是否被选中。
size() 返回 Listbox 组件中选项的数量
xview(*args) 该方法用于在水平方向上滚动 Listbox 组件的内容,一般通过绑定 Scollbar 组件的 command 选项来实现。 如果第一个参数是 "moveto",则第二个参数表示滚动到指定的位置:0.0 表示最左端,1.0 表示最右端;如果第一个参数是 "scroll",则第二个参数表示滚动的数量,第三个参数表示滚动的单位(可以是 "units" 或 "pages"),例如:xview("scroll", 2, "pages")表示向右滚动二行。
yview(*args) 该方法用于在垂直方向上滚动 Listbox 组件的内容,一般通过绑定 Scollbar 组件的 command 选项来实现
  • 属性
属性 说明
listvariable 1. 指向一个 StringVar 类型的变量,该变量存放 Listbox 中所有的项目 2. 在 StringVar 类型的变量中,用空格分隔每个项目,例如 var.set("c c++ java python")
selectbackground 1. 指定当某个项目被选中的时候背景颜色,默认值由系统指定
selectborderwidth 1. 指定当某个项目被选中的时候边框的宽度 2. 默认是由 selectbackground 指定的颜色填充,没有边框 3. 如果设置了此选项,Listbox 的每一项会相应变大,被选中项为 "raised" 样式
selectforeground 1. 指定当某个项目被选中的时候文本颜色,默认值由系统指定
selectmode 1. 决定选择的模式,tk 提供了四种不同的选择模式,分别是:"single"(单选)、"browse"(也是单选,但拖动鼠标或通过方向键可以直接改变选项)、"multiple"(多选)和 "extended"(也是多选,但需要同时按住 Shift 键或 Ctrl 键或拖拽鼠标实现),默认是 "browse"
setgrid 指定一个布尔类型的值,决定是否启用网格控制,默认值是 False
takefocus 指定该组件是否接受输入焦点(用户可以通过 tab 键将焦点转移上来),默认值是 True
xscrollcommand 为 Listbox 组件添加一条水平滚动条,将此选项与 Scrollbar 组件相关联即可
yscrollcommand 为 Listbox 组件添加一条垂直滚动条,将此选项与 Scrollbar 组件相关联即可
  • 示例操作

1) 创建列表框控件

# 创建一个列表控件,并增加相应的选项
from tkinter import *
# 创建主窗口
win = Tk()
win.title("C语言中文网")
win.geometry('400x200')
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
# 创建列表选项
listbox1 =Listbox(win)
listbox1.pack()
# i表示索引值,item 表示值,根据索引值的位置依次插入
for i,item in enumerate(["C","C++","C#","Python","Java"]):
 listbox1.insert(i,item)
# 显示窗口
win.mainloop()

image-20220512165731661

除了上述使用 enumerate() 来实现选项插入的方法外,我们还可以使用 "end" 实现,它表示将选项插入到最后一个位置,所以“Java”一定会被插入到最后一个位置上,而之前的选项会依次向前排列,如下所示:

from tkinter import *
# 创建主窗口
win = Tk()
win.title("C语言中文网")
win.geometry('400x200')
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
# 创建列表选项
listbox1 =Listbox(win)
listbox1.pack()
# i表示索引值,item 表示值,根据索引值的位置依次插入
for item in ["C","C++","C#","Python","Java"]:
 listbox1.insert("end",item)
# 显示窗口
win.mainloop()

image-20220512165831911

2) 增加滚动条和删除功能

from tkinter import *
# 创建主窗口
win = Tk()
win.title("C语言中文网")
win.geometry('400x180')
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
# 创建滚动条
s = Scrollbar(win)
# 设置垂直滚动条显示的位置,使得滚动条,靠右侧;通过 fill 沿着 Y 轴填充
s.pack(side = RIGHT,fill = Y)
# 将 selectmode 设置为多选模式,并为Listbox控件添加滚动条
listbox1 =Listbox(win,selectmode = MULTIPLE,height =5, yscrollcommand = s.set)
# i 表示索引值,item 表示值,根据索引值的位置依次插入
for i,item in enumerate(range(1,50)):
 listbox1.insert(i,item)
listbox1.pack()
# 设置滚动条,使用 yview使其在垂直方向上滚动 Listbox 组件的内容,通过绑定 Scollbar 组件的 command 参数实现
s.config(command = listbox1.yview)
# 使用匿名函数,创建删除函数,点击删除按钮,会删除选项
bt = Button(win,text='删除',command = lambda x = listbox1:x.delete(ACTIVE))
# 将按钮放置在底部
bt.pack(side = BOTTOM)
# 显示窗口
win.mainloop()

image-20220512165859747

3) StringVar() 添加列表选项

import tkinter as tk
from tkinter import messagebox
window = tk.Tk()
window.title("C语言中文网")
window.geometry('400x180')
window.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
# 创建变量,用var1用来接收鼠标点击的具体选项内容
var1 = tk.StringVar()
l = tk.Label(window, bg='#B0B0B0', font=('微软雅黑', 15), width=20, textvariable=var1)
l.pack()
# 创建一个按钮的点击事件
def click_button():
 # 使用 curselection来选中文本
 try:
     val = lb.get(lb.curselection())
 # 设置label值
     var1.set(val)
 except Exception as e:
     e = '发现一个错误'
     messagebox.showwarning(e,'没有选择任何条目')
# 创建一个按钮并放置,点击按钮调用print_selection函数
b1 = tk.Button(window, text='获取当前选项', command=click_button)
b1.pack()
# 创建Listbox并为其添加内容
var2 = tk.StringVar()
var2.set(("C语言辅导班", "Python答疑辅导", "Java答疑辅导", "C++辅导"))
# 创建Listbox,通过 listvariable来传递变量
lb = tk.Listbox(window, listvariable=var2)
# 新建一个序列,然后将值循环添加到Listbox控件中
items = ["C", "Java", "Python", "C#", "Golang", "Runby"]
for i in items:
 lb.insert('end', i)  # 从最后一个位置开始加入值
lb.insert(0, '编程学习')  # 在第一个位置插入一段字符串
lb.delete(4)  # 删除第2个位置处的索引
lb.pack()
#主窗显示
window.mainloop()

image-20220512165952847

  • Combobox控件(组合框)

通过前面内容的介绍我们知道 Listbox 是一个供用户从列表项中选择相应条目的控件。但在有些情况下,比如列表的项目过多时,若使用列表控件,列出所有选项就会显得界面格外臃肿,这时就需要用到 Combobox 控件,也就是下拉菜单控件(或称复合框),该控件是列表控件的改进版,具有更加灵活的界面,因此其应用场景相比于前者要更加广泛。

不过需要注意的是 Combobox 并不包含在 tkinter 模块中,而是包含在tkinter.ttk子模块中,因此若想使用 Combobox 控件,需要使用下面的导包方式:

from tkinter import ttk
  • 属性与方法介绍

Combobox 控件在形式虽然与列表控件存在不同,但它们的本质是相同,因此属性和方法是通用的。!

  • 示例

对于 Combobox 控件而言,它常用的方法有两个,分别是 get() 和 current(),前者表示获取当前选中选项的内容,后者表示获取选中选项的索引值。下面通过一组简单的示例进一步了解 Combobox 控件,示例代码如下:

import tkinter
from tkinter import ttk # 导入ttk模块,下拉菜单控件位于ttk子模块中
# 创建窗口
win = tkinter.Tk()
win.title("C语言中文网")
# win.geometry('400x200')
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
win.geometry('400x250')
win.resizable(0,0)
# 创建下拉菜单
cbox = ttk.Combobox(win)
# 使用 grid() 来控制控件的位置
cbox.grid(row = 1, sticky="NW")
# 设置下拉菜单中的值
cbox['value'] = ('C','C#','Go','Python','Java')
#通过 current() 设置下拉菜单选项的默认值
cbox.current(3)
# 编写回调函数,绑定执行事件,向文本插入选中文本
def func(event):
 text.insert('insert',cbox.get()+"\n")
# 绑定下拉菜单事件
cbox.bind("<<ComboboxSelected>>",func)
# 新建文本框
text = tkinter.Text(win)
# 布局
text.grid(pady = 5)
win.mainloop()

image-20220512170252419

20.9 Tkinter单选框和多选框按钮

  • Radiobutton 单选框控件

  • 属性

属性 说明
activebackground 设置当 Radiobutton 处于活动状态(通过 state 选项设置状态)的背景色,默认值由系统指定
activeforeground 设置当 Radiobutton 处于活动状态(通过 state 选项设置状态)的前景色,默认值由系统指定
compound 1. 默认值为 None,控制 Radiobutton 中文本和图像的混合模式,默认情况下,如果有指定位图或图片,则不显示文本 2. 如果该选项设置为 "center",文本显示在图像上(文本重叠图像) 3. 设置为 "bottom","left","right" 或 "top",那么图像显示在文本的旁边,比如如"bottom",则显示图像在文本的下方。
disabledforeground 指定当 Radiobutton 不可用的时的前景色颜色,默认由系统指定
indicatoron 1. 该参数表示选项前面的小圆圈是否被绘制,默认为 True,即绘制; 2. 如果设置为 False,则会改变单选按钮的样式,当点击时按钮会变成 "sunken"(凹陷),再次点击变为 "raised"(凸起)
selectcolor 设置当 Radiobutton 为选中状态的时候显示的图片;如果没有指定 image 选项,该选项被忽略
takefocus 如果是 True,该组件接受输入焦点,默认为 False
variable 表示与 Radiobutton 控件关联的变量,注意同一组中的所有按钮的 variable 选项应该都指向同一个变量,通过将该变量与 value 选项值对比,可以判断用户选中了哪个按钮。
  • 常用方法
方法 说明
deselect() 取消该按钮的选中状态
flash() 刷新 Radiobutton 控件,该方法将重绘 Radiobutton控件若干次(即在"active" 和 "normal" 状态间切换)
invoke() 1. 调用 Radiobutton 中 command 参数指定的函数,并返回函数的返回值 2. 如果 Radiobutton 控件的 state(状态) 是 "disabled" (不可用)或没有指定 command 选项,则该方法无效
select() 将 Radiobutton 控件设置为选中状态
  • 示例
import tkinter as tk
window = tk.Tk()
window.title("C语言中文网")
window.geometry('400x180')
window.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
# IntVar() 用于处理整数类型的变量
v = tk.IntVar()
# 根据单选按钮的 value 值来选择相应的选项
v.set(0)
# 使用 variable 参数来关联 IntVar() 的变量 v
tk.Radiobutton(window, text="C语言中文网", fg='blue',font=('微软雅黑','12','bold'),variable=v, value=0).pack(anchor = 'w')
tk.Radiobutton(window, text="CSDN平台", variable=v, value=2).pack(anchor = 'w')
tk.Radiobutton(window, text="知乎平台", variable=v, value=3).pack(anchor = 'w')
tk.Radiobutton(window, text="牛客网平台", variable=v, value=4).pack(anchor = 'w')
# 显示窗口
window.mainloop()

image-20220512170542062

  • 另一种写法(推荐写法)
# 当点击某一按钮时,获取选项的内容
import tkinter as tk
def select():
    dict = {1:'C语言中文网',2:'菜鸟教程',3:'W3SCHOOL',4:'微学苑'}
    strings = '您选择了' + dict.get(v.get()) + ',祝您学习愉快'
    lable.config(text = strings)
window = tk.Tk()
window.title("C语言中文网")
window.geometry('400x180')
window.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
lable = tk.Label(window,font=('微软雅黑', '15','bold'),fg='#43CD80')
lable.pack(side ='bottom')
site = [('C语言中文网',1),
        ('菜鸟教程',2),
        ('W3SCHOOL',3),
        ('微学苑',4)]
# IntVar() 用于处理整数类型的变量
v = tk.IntVar()
for name, num in site:
    radio_button = tk.Radiobutton(window,text = name, variable = v,value =num,command = select,indicatoron = False)
    radio_button.pack(anchor ='w')
# 显示窗口
window.mainloop()

image-20220512170633771

  • Checkbutton复选框控件

Checkbutton 控件是一种供用户选择相应条目的按钮控件,但与 Radiobutton 不同的是,Checkbutton 控件不仅允许用户选择一项,还允许用户同时选择多项,各个选项之间属于并列的关系。

  • 属性
属性 说明
text 显示的文本,使用 "\n" 来对文本进行换行。
variable 1. 和复选框按钮关联的变量,该变量值会随着用户选择行为来改变(选或不选),即在 onvalue 和 offvalue 设置值之间切换,这些操作由系统自动完成 2. 在默认情况下,variable 选项设置为 1 表示选中状态,反之则为 0,表示不选中。
onvalue 通过设置 onvalue 的值来自定义选中状态的值。
offvalue 通过设置 offvalue 的值来自定义未选中状态的值。
indicatoron 默认为 True,表示是否绘制用来选择的选项的小方块,当设置为 False 时,会改变原有按钮的样式,与单选按钮相同
selectcolor 选择框的颜色(即小方块的颜色),默认由系统指定
selectimage 设置当 Checkbutton 为选中状态的时候显示的图片,若如果没有指定 image 选项,该选项被忽略
textvariable Checkbutton 显示 Tkinter 变量(通常是一个 StringVar 变量)的内容,如果变量被修改,Checkbutton 的文本会自动更新
wraplength 表示复选框文本应该被分成多少行,该选项指定每行的长度,单位是屏幕单元,默认值为 0
  • 示例
from tkinter import *
win = Tk()
win.title("C语言中文网")
win.geometry('500x200')
win.resizable(0,0)
lb = Label(text='C语言中文网答疑辅导班',font=('微软雅黑', 18,'bold'),fg='#CD7054')
lb.pack()
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
# 新建整型变量
CheckVar1 = IntVar()
CheckVar2 = IntVar()
CheckVar3 = IntVar()
# 设置三个复选框控件,使用variable参数来接收变量
check1 = Checkbutton(win, text="Python",font=('微软雅黑', 15,'bold'),variable = CheckVar1,onvalue=1,offvalue=0)
check2 = Checkbutton(win, text="C语言",font=('微软雅黑', 15,'bold'),variable = CheckVar2,onvalue=1,offvalue=0)
check3 = Checkbutton(win, text="Java",font=('微软雅黑', 15,'bold'),variable = CheckVar3,onvalue=1,offvalue=0)
# 选择第一个为默认选项
# check1.select ()
check1.pack (side = LEFT)
check2.pack (side = LEFT)
check3.pack (side = LEFT)
# 定义执行函数
def study():
    # 没有选择任何项目的情况下
    if (CheckVar1.get() == 0 and CheckVar2.get() == 0 and CheckVar3.get() == 0):
        s = '您还没选择任语言'
    else:
        s1 = "Python" if CheckVar1.get() == 1 else ""
        s2 = "C语言" if CheckVar2.get() == 1 else ""
        s3 = "Java" if CheckVar3.get() == 1 else ""
        s = "您选择了%s %s %s" % (s1, s2, s3)
     #设置标签lb2的字体
    lb2.config(text=s)
btn = Button(win,text="选好了",bg='#BEBEBE',command=study)
btn.pack(side = LEFT)
# 该标签,用来显示选择的文本
lb2 = Label(win,text='',bg ='#9BCD9B',font=('微软雅黑', 11,'bold'),width = 5,height=2)
lb2.pack(side = BOTTOM, fill = X)
# 显示窗口
win.mainloop()

image-20220512170811323

  • 常用方法
方法 属性
desellect() 取消 Checkbutton 组件的选中状态,也就是设置 variable 为 offvalue
flash() 刷新 Checkbutton 组件,对其进行重绘操作,即将前景色与背景色互换从而产生闪烁的效果。
invoke() 1. 调用 Checkbutton 中 command 选项指定的函数或方法,并返回函数的返回值 2. 如果 Checkbutton 的state(状态)"disabled"是 (不可用)或没有指定 command 选项,则该方法无效
select() 将 Checkbutton 组件设置为选中状态,也就是设置 variable 为 onvalue
toggle() 改变复选框的状态,如果复选框现在状态是 on,就改成 off,反之亦然
  • 示例
from tkinter import *
win = Tk()
win.title("C语言中文网")
win.geometry('500x200')
win.resizable(0,0)
lb = Label(text='C语言中文网答疑辅导班',font=('微软雅黑', 18,'bold'),fg='#CD7054')
lb.pack()
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
# 设置三个复选框控件,
check1 = Checkbutton(win, text="Python",font=('微软雅黑', 15,'bold'),onvalue=1,offvalue=0)
check2 = Checkbutton(win, text="C语言",font=('微软雅黑', 15,'bold'),onvalue=1,offvalue=0)
check3 = Checkbutton(win, text="Java",font=('微软雅黑', 15,'bold'),onvalue=1,offvalue=0)
# 将第一个 复选框按钮的 variable值,设置为 onvalue =1 ,表示选中状态
check1.select ()
# 取消了第一个复选框的选中状态
check1.toggle()
check1.pack (side = LEFT)
check2.pack (side = LEFT)
check3.pack (side = LEFT)
# 显示窗口
win.mainloop()

image-20220512170852221

20.10 Tkinter Scale控件

  • 介绍

Scale 控件,即滑块控件或标尺控件,该控件可以创建一个类似于标尺式的滑动条对象,用户通过操作它可以直接设置相应的数值(刻度值)。

Scale 控件同样有许多应用场景,并且在我们日常工作中也会经常用到,比如电脑上调节音量的滑动条(数值范围 0-100),如下图所示:

image-20220512170948847

  • 属性
参数 说明
activebackground 指定当鼠标在上方飘过的时候滑块的背景颜色
bigincrement 1. 设置“大”增长量 2. 该选项设置增长量的大小 3. 默认值是 0,增长量为范围的 1/10
borderwidth 1. 指定边框宽度 2. 默认值是 2
command 1. 指定一个函数,每当滑块发生改变的时候都会自动调用该函数 2. 该函数有一个唯一的参数,就是最新的滑块位置 3. 如果滑块快速地移动,函数可能无法获得每一个位置,但一定会获得滑块停下时的最终位置
digits 1. 设置最多显示多少位数字 2. 补充注释:例如设置 from 选项为 0,to 选项为 20,digits 选项设置为 5,那么滑块的范围就是在 0.000 ~ 20.000 直接滑动 3. 默认值是 0(不开启)
font 1. 指定滑块左侧的 Label 和刻度的文字字体 2. 默认值由系统指定
from_ 1. 设置滑块最顶(左)端的位置 2. 默认值是 0
highlightcolor 1. 指定当 Scale 获得焦点的时候高亮边框的颜色 2. 默认值由系统指定
label 1. 你可以在垂直的 Scale 组件的顶端右侧(水平的话是左端上方)显示一个文本标签 2. 默认值是不显示标签
length 1. Scale 组件的长度,默认值是 100 像素
orient 1. 设置 Scale 控件是水平放置(HORIZONTAL)还是垂直放置(VERTICAL) 2. 默认值是 VERTICAL(垂直放置)
repeatdelay 1. 该选项指定鼠标左键点击滚动条凹槽的响应时间 2. 默认值是 300(毫秒)
repeatinterval 1. 该选项指定鼠标左键紧按滚动条凹槽时的响应间隔 2. 默认值是 100(毫秒)
resolution 1. 指定 Scale 组件的分辨率(每点击一下移动的步长) 示例: 比如 resolution 选项设置为 0.1 的话,那么每点击一下鼠标就是在 0.0 ~ 20.0 之间以 0.1 的步长移动 2. 该参数的默认值是 1
showvalue 1. 设置是否显示滑块旁边的数字 2. 默认值为 True
sliderlength 1. 设置滑块的长度 2. 默认值是 30 像素
state 1. 默认情况下 Scale 组件支持鼠标事件和键盘事件,可以通过设置该选项为 DISABLED 来禁用此功能 2. 默认值是 NORMAL
takefocus 1. 指定使用 Tab 键是否可以将焦点移动到该 Scale 组件上 2. 默认是开启的,可以通过将该选项设置为 False 避免焦点落在此组件上
tickinterval 1. 设置显示的刻度,如果设置一个值,那么就会按照该值的倍数显示刻度 2. 默认值是不显示刻度
to 1. 设置滑块最底(右)端的位置 2. 默认值是 100
troughcolor 1. 设置凹槽的颜色 2. 默认值由系统指定
variable 1. 指定一个与 Scale 组件相关联的 Tkinter 变量,该变量存放滑块最新的位置 2. 当滑块移动的时候,该变量的值也会发生相应的变化
width 1. 指定 Scale 组件的宽度 2. 默认值是 15 像素
  • 常用方法
方法 说明
coords(value=None) 1. 获得当前滑块位置相对于 Scale 控件左上角位置的相对坐标, 2. 如果设置了 value 值,则返回当滑块位于该位置时与左上角的相对坐标
get() 获得当前滑块的位置(即当前数值),返回值可以为整型或者浮点型
identify(x, y) 返回一个字符串表示指定位置下的 Scale 控件
set(value) 设置 Scale 控件的值,即滑块的位置,默认为初始位置
  • 示例
from tkinter import *
# 创建主窗口
win =Tk()
win.title("控制管理界面")
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
win.geometry('400x250')
# 添加一个 Scale 控件,默认垂直方向,步长设置为 5,长度为200,滑动块的大小为 50,最后使用label参数文本
s=Scale(win, from_ =100, to =0,resolution =5,length =200,sliderlength= 20,label ='音量控制' )
s.pack()
# 设置滑块的位置
s.set(value=15)
# 显示窗口
mainloop()

image-20220512171105127

  • 复杂点的示例
import tkinter as tk
window = tk.Tk()
window.title("购物车界面")
window.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
window.geometry('450x200+450+250')
window.resizable(0,0)
# 创建一个文本标签
label = tk.Label(window, bg='#9FB6CD',width=18, text='')
label.grid(row =2)
# 创建执行函数
def select_price(value):
    label.config(text='您购买的数量是 ' + value)
# 创建 Scale控件
scale = tk.Scale(window,
             label='选择您要购买的数量',
             from_=1,
             to= 100,
             orient=tk.HORIZONTAL,   # 设置Scale控件平方向显示
             length=400,
             tickinterval=9,       # 设置刻度滑动条的间隔
             command=select_price)  # 调用执行函数,是数值显示在 Label控件中
scale.grid(row =1)
# 显示窗口
window.mainloop()

image-20220512171124706

20.11 Tkinter Canvas画布控件

  • 介绍

Canvas 控件具有两个功能,首先它可以用来绘制各种图形,比如弧形、线条、椭圆形、多边形和矩形等,其次 Canvas 控件还可以用来展示图片(包括位图),我们将这些绘制在画布控件上的图形,称之为“画布对象”。

每一个画布对象都有一个“唯一身份ID”,这是 Tkinter 自动为其创建的,从而方便控制和操作这些画布对象。

通过 Canvas 控件创建一个简单的图形编辑器,让用户可以达到自定义图形的目的,就像使用画笔在画布上绘画一样,可以绘制各式各样的形状,从而有更好的人机交互体验。

  • 基本属性
属性 方法
background(bg) 指定 Canvas 控件的背景颜色
borderwidth(bd) 指定 Canvas 控件的边框宽度
closeenough 1. 指定一个距离,当鼠标与画布对象的距离小于该值时,认为鼠标位于画布对象上 2. 该选项是一个浮点类型的值
confine 1. 指定 Canvas 控件是否允许滚动超出 scrollregion 选项设置的滚动范围,默认值为 True
selectbackground 指定当画布对象(即在 Canvas 画布上绘制的图形)被选中时的背景色,
selectborderwidth 指定当画布对象被选中时的边框宽度(选中边框)
selectforeground 指定当画布对象被选中时的前景色
state 设置 Canvas 的状态:"normal" 或 "disabled",默认值是 "normal",注意,该值不会影响画布对象的状态
takefocus 指定使用 Tab 键可以将焦点移动到输入框中,默认为开启,将该选项设置为 False 避免焦点在此输入框中
width 指定 Canvas 的宽度,单位为像素
xscrollcommand 与 scrollbar(滚动条)控件相关联(沿着 x 轴水平方向)
xscrollincrement 1. 该选项指定 Canvas 水平滚动的“步长” 2. 例如 '3c' 表示 3 厘米,还可以选择的单位有 'i'(英寸),'m'(毫米)和 'p'(DPI,大约是 '1i' 等于 '72p') 3. 默认为 0,表示可以水平滚动到任意位置
yscrollcommand 与 scrollbar 控件(滚动条)相关联(沿着 y 轴垂直方向)
yscrollincrement 1. 该选项指定 Canvas 垂直滚动的“步长” 2. 例如 '3c' 表示 3 厘米,还可以选择的单位有 'i'(英寸),'m'(毫米)和 'p'(DPI,大约是 '1i' 等于 '72p') 3. 默认值是 0,表示可以垂直方向滚动到任意位置
  • 示例
import tkinter as tk
window = tk.Tk()
window.title("C语言中文网")
window.geometry('400x200')
# 创库不允许改变
window.resizable(0,0)
window.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
# 创建画布
canvas = tk.Canvas(window,
                   bg='#CDC9A5',
                   height=200,
                   width=300)
canvas.pack()
window.mainloop()

image-20220512172121527

  • 常见绘图方法
方法 说明
create_line(x0, y0, x1, y1, ... , xn, yn, options) 1. 根据给定的坐标创建一条或者多条线段; 2. 参数 x0,y0,x1,y1,...,xn,yn 定义线条的坐标; 3. 参数 options 表示其他可选参数
create_oval(x0, y0, x1, y1, options) 1. 绘制一个圆形或椭圆形; 2. 参数 x0 与 y0 定义绘图区域的左上角坐标;参数 x1 与 y1 定义绘图区域的右下角坐标; 3. 参数 options 表示其他可选参数
create_polygon(x0, y0, x1, y1, ... , xn, yn, options) 1. 绘制一个至少三个点的多边形; 2. 参数 x0、y0、x1、y1、...、xn、yn 定义多边形的坐标; 3. 参数 options 表示其他可选参数
create_rectangle(x0, y0, x1, y1, options) 1. 绘制一个矩形; 2. 参数 x0 与 y0 定义矩形的左上角坐标;参数 x 与 y1 定义矩形的右下角坐标; 3. 参数 options 表示其他可选参数
create_text(x0, y0, text, options) 1. 绘制一个文字字符串。其中 2. 参数 x0 与 y0 定义文字字符串的左上角坐标,参数 text 定义文字字符串的文字; 3. 参数 options 表示其他可选参数
create_image(x, y, image) 1. 创建一个图片; 2. 参数 x 与 y 定义图片的左上角坐标; 3. 参数 image 定义图片的来源,必须是 tkinter 模块的 BitmapImage 类或 PhotoImage 类的实例变量。
create_bitmap(x, y, bitmap) 1. 创建一个位图; 2. 参数 x 与 y 定义位图的左上角坐标; 3. 参数 bitmap 定义位图的来源,参数值可以是 gray12、gray25、gray50、gray75、hourglass、error、questhead、info、warning 或 question,或者也可以直接使用 XBM(X Bitmap)类型的文件,此时需要在 XBM 文件名称前添加一个 @ 符号,例如 [email protected]
create_arc(coord, start, extent, fill) 1. 绘制一个弧形; 2. 参数 coord 定义画弧形区块的左上角与右下角坐标; 3. 参数 start 定义画弧形区块的起始角度(逆时针方向); 4. 参数 extent 定义画弧形区块的结束角度(逆时针方向); 5. 参数 fill 定义填充弧形区块的颜色。

注意:上述方法都会返回一个画布对象的唯一 ID。关于 options 参数,下面会通过一个示例对经常使用的参数做相关介绍。(但由于可选参数较多,并且每个方法中的参数作用大同小异,因此对它们不再逐一列举)

从上述表格不难看出,Canvas 控件采用了坐标系的方式来确定画布中的每一点。一般情况下,默认主窗口的左上角为坐标原点,这种坐标系被称作为“窗口坐标系”,但也会存在另外一种情况,即画布的大小可能大于主窗口,当发生这种情况的时,可以采用带滚动条的 Canvas 控件,此时会以画布的左上角为坐标原点,我们将这种坐标系称为“画布坐标系”。

1) 绘制直线

from tkinter import *
root = Tk()
# 设置窗口的背景颜色以区别画布
root.config(bg='#87CEEB')
root.title("C语言中文网")
root.geometry('450x350')
root.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
# 设置画布的背景颜色为白色
cv=Canvas(root,bg="white",width =300, height = 250)
# 将控件放置在主窗口中
cv.pack()
# 设置坐标点,此处可以元组的形式来设置坐标点
point=[(10,20),(20,30),(30,40),(40,100),(80,120),(150,90)]
# 创建画布,添加线条
# fill 参数指定填充的颜色,如果为空字符串,则表示透明
# dash 参数表示用来绘制虚线轮廓,元组参数,分别代表虚线中线段的长度和线段之间的间隔
# arrow 设线段的箭头样式,默认不带箭头,参数值 first 表示添加箭头带线段开始位置,last表示到末尾占位置,both表示两端均添加
# smooth 布尔值参数,表示是否以曲线的样式划线,默认为 False
# width 控制线宽
line1=cv.create_line(point,fill="purple",dash=(1,1),arrow=LAST,width=5)
print('线段line1的画布id号:',line1)
line2=cv.create_line(point,fill="red",arrow=BOTH,smooth=TRUE,width=5)
print('线段line2的画布id号:',line2)
# 移动其中一条线段,只需要更改其坐标就可以,使用 coords()方法移动曲线
cv.coords(line2,50,30,25,35,35,40,50,120,60,170,10,180)
# 显示窗口
root.mainloop()

image-20220512172235902

  • create_line() 函数的相关参数
属性 说明
activedash 当画布对象状态为 "active" 的时候,绘制虚线
activefill 当画布对象状态为 "active" 的时候,填充颜色
activestipple 当画布对象状态为 "active" 的时候,指定填充的位图
activewidth 当画布对象状态为 "active" 的时候,指定边框的宽度
arrow 1. 默认线段是不带箭头的,通过设置该选项添加箭头到线段中 2. "first" 表示添加箭头到线段开始的位置 3. "last" 表示添加箭头到线段结束的位置 4. "both" 表示两端均添加箭头
arrowshape 1. 用一个三元组来指定箭头的形状,默认值是 (8, 10, 3),元组中的数值分别代表箭头中三条边的长度
capstyle 1. 指定线段两端的样式,默认值是 "butt" 2. 该选项的值可以是: "butt"(线段的两段平切于起点和终点) "projecting"(线段的两段在起点和终点的位置将 width 选项设置的长度分别延长一半) "round"(线段的两段在起点和终点的位置将 width设置的长度分别延长一半,并以圆角进行绘制)
dash 绘制虚线,该选项值是一个整数元组,元组中的元素分别代表短线的长度和间隔,比如 (3, 5) 代表 3 个像素的短线和 5 个像素的间隔
dashoffset 指定虚线开始的偏移位置,比如 dash=(5, 1, 2, 1),dashoffset=3,则从 2 开始画虚线
disableddash 当画布对象状态为 "disabled" 的时候,绘制虚线
disabledfill 当画布对象状态为 "disabled" 的时候,填充颜色
disabledstipple 当画布对象状态为 "disabled" 的时候,指定填充的位图
disabledwidth 当画布对象状态为 "disabled" 的时候,指定边框的宽度
fill 1. 指定填充的颜色,空字符串表示透明
joinstyle 1. 指定当绘制两个相邻线段之间时接口的样式,默认为 "round" 2. 该选项的值可以是: "round"(以连接点为圆心,1/2 width 选项设置的长度为半径来绘制圆角) "bevel"(在连接点处将两线段的夹角做平切操作) "miter"(沿着两线段的夹角延伸至一个点)
offset 指定当点画模式时填充位图的偏移
smooth 默认值为 False,若设置为 True,表示将以曲线的样式代替所绘线段
splinesteps 当绘制曲线的时,该选项指定由多少条折线来构成曲线,默认值是 12,这里需要注意,只有当 smooth 选项为 True 时该选项才会生效。
state 指定该画布对象的状态,默认值为 "normal",参数值有 "normal","disabled"(不可用)和 "hidden"(隐藏)三种状态。
stipple 指定一个位图进行填充,默认值为空字符串,表示实心
tags 为创建的画布对象添加标签
width 指定边框的宽度

对于扇形、矩形、三角形、圆形等,这些封闭式图形,它们由轮廓线和填充颜色两部分组成。在绘制这些图形时相关函数的可选参数与上述表格也存在略微差异,下面以绘制扇形的 create_arc() 函数为例做简单的介绍:

属性 方法
activedash 当画布对象状态为 "active" 的时候,绘制虚线
activefill 当画布对象状态为 "active" 的时候,填充颜色
activeoutline 当画布对象状态为 "active" 的时候,绘制轮廓线
activeoutlinestipple 当画布对象状态为 "active" 的时候,指定填充轮廓的位图
activestipple 当画布对象状态为 "active" 的时候,指定填充的位图
activewidth 当画布对象状态为 "active" 的时候,指定边框的宽度
dash 指定绘制虚线轮廓,与绘制线段的含义相同
dashoffset 指定虚线轮廓开始的偏移位置
disableddash 当画布对象状态为 "disabled" 的时候,绘制虚线
disabledfill 当画布对象状态为 "disabled" 的时候,填充颜色
disabledoutline 当画布对象状态为 "disabled" 的时候,绘制轮廓线
disabledoutlinestipple 当画布对象状态为 "disabled" 的时候,指定填充轮廓的位图
disabledstipple 当画布对象状态为 "disabled" 的时候,指定填充的位图
disabledwidth 当画布对象状态为 "disabled" 的时候,指定边框的宽度
extent 指定跨度(从 start 选项指定的位置开始到结束位置的角度)默认值是 90.0
fill 与上述表格的含义相同,表示指定的填充颜色,若为空字符串则为透明色
offset 指定当点画模式时填充位置的偏移,参数值为 "x,y"坐标偏移和位置偏移两种方式,比如 "ne"/"e" 等
outline 指定轮廓的颜色
outlineoffset 指定当点画模式绘制轮廓时位图的偏移
outlinestipple 当 outline 选项被设置时,该选项用于指定一个位图来填充边框,默认值是空字符串,表示黑色
start 指定起始位置的偏移角度
style 默认创建的是扇形,指定该方法创建的是扇形("pieslice")、弓形("chord")还是弧形("arc")
tags 为创建的画布对象添加标签
width 指定边框的宽度
  • 绘制几何图形
from tkinter import *
root = Tk()
# 设置主窗口区的背景颜色以区别画布区的颜色
root.config(bg='#8DB6CD')
root.title("C语言中文网")
root.geometry('500x400')
root.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
# 将画布设置为白色
canvas = Canvas(root,width = 400,height = 400,bg='white')
# 设置基准坐标
x0,y0,x1,y1 = 10,10,80,80
# 绘制扇形,起始角度为 0 度,结束角度为 270, 扇形区域填充色为淡蓝色,轮廓线为蓝色,线宽为 2px
arc = canvas.create_arc(x0, y0, x1, y1,start = 0, extent = 270, fill = '#B0E0E6',outline ='blue',width = 2)
# 绘制圆形
oval = canvas.create_oval(x0+150, y0, x1+150, y1,fill ='#CD950C',outline = 'blue',width=2)
# 绘制矩形,并将轮廓线设置为透明色,即不显示最外围的轮廓线,默认为黑色
rect = canvas.create_rectangle(x0,y0+100,x1,y1+100,fill='red',outline = '')
# 绘制一个三角形,填充色为绿色
trigon = canvas.create_polygon(80,80,150,80,200,200, outline="", fill="green",)
# 当然也可以绘制一个任意多边形,只要你的坐标正确就可以
# 绘制一个多边形,首先定义一系列的多边形上的坐标点
poly_points=[(0,280),(140,200),(140,240),(270,240),(270,320),(140,320),(140,360)]
polygon = canvas.create_polygon(poly_points,fill="#BF3EFF")
# 放置画布在主窗口
canvas.pack()
# 显示窗口
root.mainloop()

image-20220512172353609

注意:create_rectangle() 方法的前两个参数决定了矩形的左上角坐标,后两个参数决定了矩形的右下角坐标;另外 create_oval() 方法并不是只能绘制圆形,还能绘制椭圆形,这取决于传入的参数。

除了能够绘制几何图形之外,Tkinter 还可以展示图片、创建位图以及文本信息等,示例如下所示:

from tkinter import *
root=Tk()
# # 设置主窗口区的背景颜色以区别画布区的颜色
root.config(bg='#8DB6CD')
root.title("C语言中文网")
root.geometry('500x300')
root.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
# # 将画布设置为白色
cv = Canvas(root,bg='white')
# tkinter 提供的内置位图名称
bitmaps = ["error", "gray75", "gray50", "gray25", "gray12",
"hourglass", "info", "questhead", "question", "warning"]
# 列出所有的位图样式
for i in range(len(bitmaps)):
    # 前两个参数指定一个位图的位置,后续依次排列
    cv.create_bitmap((i+1)*30,30,bitmap=bitmaps[i])
#并在画布上添加文本
# 参数说明,前两个参数(x0,y0)参照点,指定文字字符串的左上角坐标
# anchor 指定了文本的对于参照点的相对位置,以方位来指定,比如 W/E/N/S等
cv.create_text(30,80,text = "tkinter内置位图预览",fill ='#7CCD7C',anchor = W,font =('微软雅黑',15,'bold'))
# 展示图片,使用 PhotoImage()来加载图片
img = PhotoImage (file="C:/Users/Administrator/Desktop/c.biancheng.gif")
cv.create_image(30,150,image = img,anchor =W)
cv.create_text(30,220,text = "图片预览",fill ='#7CCD7C',anchor = W,font =('微软雅黑',15,'bold'))
cv.pack()
mainloop()

image-20220512172423419

注意,添加到 Canvas 上的对象会一直保留直着。如果你希望修改它们,您可以使用 coords() 和 move() 方法来移动画布上的对象,当然您可以使用 delete() 来删除它们,示例如下:

from tkinter import *
root=Tk()
# # 设置主窗口区的背景颜色以区别画布区的颜色
root.config(bg='#8DB6CD')
root.title("C语言中文网")
root.geometry('500x300')
root.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
# 定义移动函数
def move_img():
    # 定义移动坐标
    cv.move(image1,50,30)
# # 将画布设置为白色
cv = Canvas(root,bg='white')
# 使用 PhotoImage()来加载图片
img = PhotoImage (file="C:/Users/Administrator/Desktop/c.biancheng.gif")
image1=cv.create_image(30,150,image = img,anchor =W)
# 将按钮放置在画布中
btn=Button(cv,text="点击移动画布",bg="#8A8A8A",activebackground="#7CCD7C",command=move_img)
# 在指定位置创建一个窗口控件,tags来添加标签
cv.create_window(365,250,height=30,width=30,window=btn)
# 调用delete() 删除画布对象,若传入ALL,则删除所有的画布对象
#cv.delete(image1)
cv.pack()
# 显示窗口
root.mainloop()

image-20220512172451184

20.12 Tkinter Menu菜单控件

  • 介绍

Menu 控件(菜单控件)可以说是 GUI 中“精髓所在”,它以可视化的方式将一系列的“功能选项卡”进行分组,并在每个分组下又“隐藏”了许多其他的“选项卡”。当打开菜单时,这些选项卡就会“显式”的呈现出来,方便用户进行选择,比如 Windows 系统中记事本文件(.txt文件类型)的界面:

image-20220512183803793

通过使用菜单控件(Menu)可以充分地节省有限的窗口区域,让我们的界面更加简洁优雅,避免臃肿、混乱。

Tkinter Menu 控件提供了三种类型的菜单,分别是:topleve(主目录菜单)、pull-down(下拉式菜单)、pop-up(弹出式菜单,或称快捷式菜单)。

  • 方法
方法 说明
add_cascade(**options) 添加一个父菜单,将一个指定的子菜单,通过 menu 参数与父菜单连接,从而创建一个下拉菜单。
add_checkbutton(**options) 添加一个多选按钮的菜单项
add_command(**options) 添加一个普通的命令菜单项
add_radiobutton(**options) 添加一个单选按钮的菜单项
add_separator(**options) 添加一条分割线
add(add(itemType, options)) 添加菜单项,此处 itemType 参数可以是以下几种:"command"、"cascade", "checkbutton"、"radiobutton"、"separator" 五种,并使用 options 选项来设置 菜单其他属性。

除了上述方法之外,Menu 控件也提供了一些其他方法来操作菜单项,比如删除菜单项、获取菜单项、设置指定的菜单项等,如下表所示:

方法 说明
delete(index1, index2=None) 1. 删除 index1 ~ index2(包含)的所有菜单项 2. 如果忽略 index2 参数,则删除 index1 指向的菜单项
entrycget(index, option) 获得指定菜单项的某选项的值
entryconfig(index, **options) 设置指定菜单项的选项
index(index) 返回与 index 参数相应的选项的序号
insert(index, itemType, **options) 插入指定类型的菜单项到 index 参数指定的位置,类型可以是 是:"command","cascade","checkbutton","radiobutton" 或 "separator" 中的一个,或者也可以使用 insert_类型() 形式来, 比如 insert_cascade(index, **options)..等
invoke(index) 调用 index 指定的菜单项相关联的方法
post(x, y) 在指定的位置显示弹出菜单
type(index) 获得 index 参数指定菜单项的类型
unpost() 移除弹出菜单
yposition(index) 返回 index 参数指定的菜单项的垂直偏移位置
  • Menu 控件的 options 参数的简单介绍
属性 说明
accelerator 1. 设置菜单项的快捷键,快捷键会显示在菜单项目的右边,比如 accelerator = "Ctrl+O" 表示打开; 2. 注意,此选项并不会自动将快捷键与菜单项连接在一起,必须通过按键绑定来实现
command 选择菜单项时执行的 callback 函数
label 定义菜单项内的文字
menu 此属性与 add_cascade() 方法一起使用,用来新增菜单项的子菜单项
selectcolor 指定当菜单项显示为单选按钮或多选按钮时选择中标志的颜色
state 定义菜单项的状态,可以是 normal、active 或 disabled
onvalue/offvalue 1. 默认情况下,variable 选项设置为 1 表示选中状态,反之设置为 0,设置 offvalue/onvalue 的值可以自定义未选中状态的值 2.
tearoff 1. 如果此选项为 True,在菜单项的上面就会显示一个可选择的分隔线; 2. 注意:分隔线会将此菜单项分离出来成为一个新的窗口
underline 设置菜单项中哪一个字符要有下画线
value 1. 设置按钮菜单项的值 2. 在同一组中的所有按钮应该拥有各不相同的值 3. 通过将该值与 variable 选项的值对比,即可判断用户选中了哪个按钮
variable 当菜单项是单选按钮或多选按钮时,与之关联的变量
  • 示例

1)创建主目录菜单

主目录菜单也称之为“顶级菜单”,下拉菜单等其他子菜单的都需要建立在“顶级菜单”的基础之上,下面示例创建了一个类似于“记事本”界面的程序,代码如下:

from tkinter import *
import tkinter . messagebox
#创建主窗口
win = Tk()
win.config(bg='#87CEEB')
win.title("C语言中文网")
win.geometry('450x350+300+200')
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
# 绑定一个执行函数,当点击菜单项的时候会显示一个消息对话框
def menuCommand() :
 tkinter.messagebox.showinfo("主菜单栏","你正在使用主菜单栏")
# 创建一个主目录菜单,也被称为顶级菜单
main_menu = Menu (win)
#新增命令菜单项,使用 add_command() 实现
main_menu.add_command (label="文件",command=menuCommand)
main_menu.add_command (label="编辑",command=menuCommand)
main_menu.add_command (label="格式",command=menuCommand)
main_menu.add_command (label="查看",command=menuCommand)
main_menu.add_command (label="帮助",command=menuCommand)
#显示菜单
win.config (menu=main_menu)
win.mainloop()

image-20220512184105681

如上图所示,当点击主目录中的任意一个菜单选项时都会跳出一个消息对话框。

2) 创建下拉菜单

下拉菜单时主菜单的重要组成部分,也是用户选择相关命令的重要交互界面,下拉菜单的创建方式也非常简单,不过需要我们注意,下拉菜单是建立的主菜单(即顶级菜单)的基础之上的,并非主窗口之上,这一点千万不要搞混,否则创建下拉菜单会失败。

下面继续仿照“记事本”的相关功能来创建下拉菜单,示例如下:

#创建一个下拉式菜单
from tkinter import *
import tkinter .messagebox
#创建主窗口
win = Tk()
win.config(bg='#87CEEB')
win.title("C语言中文网")
win.geometry('450x350+300+200')
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
#创建一个执行函数,点击下拉菜单中命令时执行
def menuCommand() :
 tkinter .messagebox .showinfo("下拉菜单", "您正在使用下拉菜单功能")
#创建主目录菜单(顶级菜单)
mainmenu = Menu (win)
#在顶级菜单上新增"文件"菜单的子菜单,同时不添加分割线
filemenu = Menu (mainmenu, tearoff=False)
#新增"文件"菜单的菜单项,并使用 accelerator 设置菜单项的快捷键
filemenu.add_command (label="新建",command=menuCommand,accelerator="Ctrl+N")
filemenu.add_command (label="打开",command=menuCommand, accelerator="Ctrl+O")
filemenu.add_command (label="保存",command=menuCommand, accelerator="Ctrl+S")
# 添加一条分割线
filemenu.add_separator ()
filemenu.add_command (label="退出",command=win. quit)
#在主目录菜单上新增"文件"选项,并通过menu参数与下拉菜单绑定
mainmenu.add_cascade (label="文件",menu=filemenu)
# 将主菜单设置在窗口上
win.config (menu=mainmenu)
# 绑定键盘事件,按下键盘上的相应的键时都会触发执行函数
win.bind ("<Control-n>",menuCommand)
win. bind ("<Control-N>", menuCommand)
win.bind ("<Control-o>",menuCommand)
win. bind ("<Control-O>", menuCommand)
win. bind ("<Control-s>", menuCommand)
win.bind ("<Control-S>",menuCommand)
# 显示主窗口
win.mainloop()

image-20220512184241527

3) 创建弹出菜单栏

弹出式菜单栏,也称为快捷式菜单栏,比如通过点击鼠标右键弹出一个菜单栏,其中包含一些常用的选项卡,如复制、粘贴等,如下所示:在记事本的空白处点击鼠标右键会弹出一个菜单栏。

image-20220512184259980

Tkinter Menu 控件同样可以是实现上述功能,而且并不复杂,示例如下:

import tkinter as tk
root = tk.Tk()
root.config(bg='#8DB6CD')
root.title("C语言中文网")
root.geometry('400x300')
root.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
def func():
 print('您通过弹出菜单执行了命令')
# 创建一个弹出菜单
menu = tk.Menu(root, tearoff=False)
menu.add_command(label="新建", command=func)
menu.add_command(label="复制", command=func)
menu.add_command(label="粘贴", command=func)
menu.add_command(label="剪切", command=func)
# 定义事件函数
def command(event):
 # 使用 post()在指定的位置显示弹出菜单
 menu.post(event.x_root, event.y_root)

# 绑定鼠标右键,这是鼠标绑定事件
# <Button-3>表示点击鼠标的右键,1 表示左键,2表示点击中间的滑轮
root.bind("<Button-3>", command)
root.mainloop()

image-20220512184404470

4) 菜单按钮控件

Menubutton(菜单按钮控件)是一个与 Menu 控件相关联的按钮,当我们按下按钮的时候下拉菜单就会自动弹出。通过 Menubutton 创建的菜单按钮可以自由地放置在窗口中的任意位置,从而提高了 GUI 界面的灵活性。

下面看一组简单使用示例:

from tkinter import *
win=Tk()
win.config(bg='#87CEEB')
win.title("C语言中文网")
win.geometry('450x350+300+200')
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
#创建一个菜单按钮
menubtn=Menubutton(win, text='点击进行操作', relief='sunk')
# 设置位置(布局)
menubtn.grid(padx=195, pady=105)
#添加菜单,使用 tearoff 参数不显示分割线
filemenu=Menu(menubtn,tearoff = False)
filemenu.add_command(label='新建')
filemenu.add_command(label='删除')
filemenu.add_command(label='复制')
filemenu.add_command(label='保存')
# 显示菜单,将菜单命令绑定在菜单按钮对象上
menubtn.config(menu=filemenu)
win.mainloop()

image-20220512185001492

20.13 Tkinter Scrollbar滚动条控件

  • 介绍

Scrollbar 控件常用于创建一个水平或者垂直的滚动条,通常情况下,Scrollbar 控件可以与 Listbox、Text、Canvas 以及 Entry 等控件一起使。

滚动条控件是 GUI 程序中经常使用的一种控件类型,它主要用来控制控件区域的可见范围,比如当 Text 控件的文本内容非常多时,为了方便用户阅读,可以给 Text 控件增加滚动条,用户只需拖动滚动条就能完成内容的阅读。

  • 属性
属性 说明
activebackground 指定当鼠标在上方飘过的时候滑块和箭头的背景颜色,默认由系统决定
activerelief 指定当鼠标在滑块上方飘过时滑块的样式,默认值是 "raised",其他可选值有 "flat","sunken","groove","ridge"
background(bg) 指定背景颜色,默认值由系统指定
borderwidth(bd) 指定边框宽度,默认值是 0
command 当滚动条更新时回调的函数,通常指定对应组件的 xview() 或 yview() 方法
cursor 指定当鼠标在上方飘过的时的鼠标样式,默认值由系统指定
elementborderwidth 1. 指定滚动条和箭头的边框宽度 2. 默认值是 -1(表示使用 borderwidth 选项的值)
jump 1. 指定当用户拖拽滚动条时的行为 2. 默认值为 False,滚动条的任何一丝变动都会即刻调用 command 指定的回调函数 3. 设置为 True 则当用户松开鼠标才调用
orient 指定绘制 "horizontal"(垂直滚动条)还是 "vertical"(水平滚动条),默认值是 VERTICAL
repeatdelay 该选项指定鼠标左键点击滚动条凹槽的响应时间,默认值是 300(毫秒)
repeatinterval 该选项指定鼠标左键紧按滚动条凹槽时的响应间隔,默认值是 100(毫秒)
takefocus 指定使用 Tab 键可以将焦点移到该 Scrollbar 组件上,默认为开启,可以将该选项设置为 False 避免焦点在此组件上
troughcolor 指定凹槽的颜色,默认由系统指定
width 指定滚动条的宽度,默认值是 16px
  • Scrollbar 控件常用的函数
属性 说明
activate(element) 1. 显示 element 参数指定的元素的背景颜色和样式; 2. element 参数可以设置为:"arrow1"(箭头1),"arrow2"(箭头2)或 "slider"(滑块)
delta(deltax, deltay) 1. 给定一个鼠标移动的范围 deltax 和 deltay,然后该方法返回一个浮点类型的值(范围 -1.0 ~ 1.0) 2. 注意:deltax 表示水平移动量,deltay 表示垂直移动量
fraction(x, y) 给定一个像素坐标 (x, y),该方法返回最接近给定坐标的滚动条位置。
get() 返回当前滑块的位置 (a, b),其中 a 值表示当前滑块的顶端或左端的位置,b 值表示当前滑块的底端或右端的位置。
identify(x, y) 1. 返回一个字符串表示指定位置下(如果有的话)的滚动条部件, 2. 返回值可以是:"arrow1"(箭头1),"arrow2"(箭头2)、"slider"(滑块)或 ""(空)
set(*args) 1. 设置当前滚动条的位置 2. 该方法有两个参数即 (first, last),其中 first 表示当前滑块的顶端或左端的位置,last 表示当前滑块的底端或右端的位置(范围 0.0 ~ 1.0)
  • 示例
import tkinter as tk
root = tk.Tk()
root.title("C语言中文网")
root.geometry('450x180+300+200')
root.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
# 创建一个滚动条控件,默认为垂直方向
sbar1= tk.Scrollbar(root)
# 将滚动条放置在右侧,并设置当窗口大小改变时滚动条会沿着垂直方向延展
sbar1.pack(side=RIGHT, fill=Y)
# 创建水平滚动条,默认为水平方向,当拖动窗口时会沿着X轴方向填充
sbar2 = Scrollbar (root, orient=HORIZONTAL)
sbar2.pack(side=BOTTOM, fill=X)
# 创建列表框控件,并添加两个滚动条(分别在垂直和水平方向),使用 set() 进行设置
mylist = tk.Listbox(root,xscrollcommand = sbar2.set,yscrollcommand = sbar1.set)
for i in range(30):
    mylist.insert(END,'第'+ str(i+1)+'次:'+'C语言中文网,网址为:c.biancheng.net'+ '\n' )
# 当窗口改变大小时会在X与Y方向填满窗口
mylist.pack(side=LEFT,fill = BOTH)
# 使用 command 关联控件的 yview、xview方法
sbar1.config(command =mylist.yview)
sbar2.config(command = mylist.xview)
#  显示主窗口
root.mainloop()

image-20220512185139692

20.14 Tkinter Event事件处理

  • 事件绑定方法

Tkinter 提供的事件处理机制允许我们为“控件”绑定相应的事件和事件处理函数(即 callback函数),从而实现控件与用户的交互,其语法格式如下:

widget.bind("<event>",func)

上述语法中,widget 代表控件的实例对象,之后,采用 bind() 方法进行事件绑定,该函数有两个参数:

  • :一个字符串参数,表示事件的类型,并使用“尖括号”的形式进行包裹;
  • func:表示事件的处理函数(callback,即回调函数),当触发事件时,Tk 会携带事件对象(Event)去调用 func 方法。

注意:bind() 方法可以完成事件与处理函数绑定,而使用 unbind() 方法可以将事件与处理函数解绑。

  • 常用事件类型

事件类型(也称事件码)是 Tkinter 模块规定的,主要包括鼠标、键盘、光标等相关事件,Tkinter 为其规定了相应的语法格式:

<modifier-type-detail>

上述语法由三部分组成,说明如下:

  • <>:事件类型必须包含在“尖括号”内;

  • modifier:可选项,事件类型的修饰符,通常用于描述组合键、双击、大写锁定键以及等;

  • type:是必不可少的一项,表示事件的具体类型;

  • detail:可选项,通常用于描述具体的哪个按键,比如 表示鼠标左键;

    这里有必要对经常使用的 modifier 修饰符做简单的介绍,修饰符可以修改事件的激活条件,比如双击鼠标或者需要同时按下某个键才触发事件,常用的修饰符如下:

    修饰符 说明
    Control 事件发生时需按下 Control 键
    Alt 事件发生时需按下 Alt 键
    Shift 事件发生时需按下 Shift 键
    Lock 事件发生时需处于大写锁定状态
    Double 事件连续发生两次,比如双击鼠标
    Triple 事件连续发生三次
    Quadruple 事件连续发生四次
  • 常用事件类型
事件码 说明
单击鼠标左键,简写为,后面的数字可以是1/2/3,分别代表左键、中间滑轮、右键
释放鼠标左键,后面数字可以是1/2/3,分别代表释放左键、滑轮、右键
按住鼠标左键移动,分别表示按住鼠标滑轮移动、右键移动
转动鼠标滑轮
双击鼠标左键
鼠标光标进入控件实例
鼠标光标离开控件实例
按下键盘上的任意键
<KeyPress-字母>/<KeyPress-数字> 按下键盘上的某一个字母或者数字键
释放键盘上的按键
回车键,其他同类型键有///
空格键
/// 方向键
... 常用的功能键
组合键,再比如,表示用户同时点击 Ctrl + Shift + T
当控件获取焦点时候触发,比如鼠标点击输入控件输入内容,可以调用 focus_set() 方法使控件获得焦点
当控件失去焦点时激活,比如当鼠标离开输入框的时候
控件的发生改变的时候触发事件,比如调整了控件的大小等
当控件的状态从“激活”变为“未激活”时触发事件
当控件被销毁的时候触发执行事件的函数
当窗口或组件的某部分不再被覆盖的时候触发事件
当应用程序至少有一部分在屏幕中是可见状态时触发事件
  • Event事件对象

当事件触发后,Tkinter 会自动将事件对象交给回调函数进行下步的处理,Event 对象包含了以下常用属性:

属性 说明
widget 发生事件的是哪一个控件
x,y 相对于窗口的左上角而言,当前鼠标的坐标位置
x_root,y_root 相对于屏幕的左上角而言,当前鼠标的坐标位置
char 用来显示所按键相对应的字符
keysym 按键名,比如 Control_L 表示左边的 Ctrl 按键
keycode 按键码,一个按键的数字编号,比如 Delete 按键码是107
num 1/2/3中的一个,表示点击了鼠标的哪个按键,按键分为左、中、右
width,height 控件的修改后的尺寸,对应着 事件
type 事件类型
  • 键盘事件示例
from tkinter import *
# 定义事件函数,必须用event参数
def show_key(event):
    # 查看触发事件的按钮
    s=event.keysym
    # 将其显示在按钮控件上
    lb.config(text=s)
root=Tk()
root.config(bg='#87CEEB')
root.title("C语言中文网")
root.geometry('450x350+300+200')
root.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
# 添加一个按钮控件
lb=Label(root,text='请按键',fg='blue',font=('微软雅黑',15))
# 给按钮控件绑定事件,按下任意键,然后调用事件处理函数。注意,此处需要在英文状态下进行输入
lb.bind('<Key>',show_key)
# 设置按钮获取焦点
lb.focus_set()
lb.pack()
# 显示窗口
root.mainloop()

image-20220512185739995

注意:在上述示例中,只有当 Label 控件获取焦点后才能接收键盘事件,因此在给控件绑定事件和回调函数后,需要使用 focus_set() 方法来获取焦点。

  • 鼠标事件示例
# 定义事件函数
from tkinter import *
def handleMotion(event):
    lb1['text'] = '你移动了光标的所在位置'
    lb2['text'] = '目前光标位置:x ='+ str(event.x)+';y='+str(event.y)
    print('光标当前位置',event.x,event.y)
# 创建主窗口
win = Tk()
win.config(bg='#87CEEB')
win.title("C语言中文网")
win.geometry('450x350+300+200')
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
# 创建一个窗体容器frame
frame = Frame (win, relief=RAISED, borderwidth=2, width=300,height=200)
frame.bind('<Motion>',handleMotion)
lb1 = Label(frame,text='没有任何事件触发', bg='purple', )
# 使用place进行位置布局,下一节会介绍
lb1.place (x=20,y=20)
lb2 = Label(frame,text='')
lb2.place (x=16,y=60)
frame.pack(side=TOP)
# 显示窗口
win.mainloop()

image-20220512185840948

20.15 Tkinter布局管理器

Tkinter 提供了三种常用的布局管理器,分别是 pack()、grid() 以及 place(),如下表所示:

方法 说明
pack() 按照控件的添加顺序其进行排列,遗憾的是此方法灵活性较差
grid() 以行和列(网格)形式对控件进行排列,此种方法使用起来较为灵活
place() 可以指定组件大小以及摆放位置,三个方法中最为灵活的布局方法
  • pack()

pack() 是一种较为简单的布局方法,在不使用任何参数的情况下,它会将控件以添加时的先后顺序,自上而下,一行一行的进行排列,并且默认居中显示。pack() 方法的常用参数如下所示:

属性 说明
anchor 组件在窗口中的对齐方式,有 9 个方位参数值,比如"n"/"w"/"s"/"e"/"ne",以及 "center" 等(这里的 e w s n分别代表,东西南北)
expand 是否可扩展窗口,参数值为 True(扩展)或者 False(不扩展),默认为 False,若设置为 True,则控件的位置始终位于窗口的中央位置
fill 参数值为 X/Y/BOTH/NONE,表示允许控件在水平/垂直/同时在两个方向上进行拉伸,比如当 fill = X 时,控件会占满水平方向上的所有剩余的空间。
ipadx,ipady 需要与 fill 参数值共同使用,表示组件与内容和组件边框的距离(内边距),比如文本内容和组件边框的距离,单位为像素(p),或者厘米(c)、英寸(i)
padx,pady 用于控制组件之间的上下、左右的距离(外边距),单位为像素(p),或者厘米(c)、英寸(i)
side 组件放置在窗口的哪个位置上,参数值 'top','bottom','left','right'。注意,单词小写时需要使用字符串格式,若为大写单词则不必使用字符串格式
  • 示例
from tkinter import  *
win = Tk()
win.title("C语言中文网")
win.geometry('450x300+300+300')
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
lb_red = Label(win,text="红色",bg="Red",fg='#ffffff',relief=GROOVE)
# 默认以top方式放置
lb_red.pack()
lb_blue = Label(win,text="蓝色",bg="blue",fg='#ffffff',relief=GROOVE)
# 沿着水平方向填充,使用 pady 控制蓝色标签与其他标签的上下距离为 5 个像素
lb_blue.pack(fill=X,pady='5px')
lb_green = Label(win,text="绿色",bg="green",fg='#ffffff',relief=RAISED)
# 将 黄色标签所在区域都填充为黄色,当使用 fill 参数时,必须设置 expand = 1,否则不能生效
lb_green.pack(side=LEFT,expand=1,fill = BOTH)
win.mainloop()

image-20220512190110090

  • grid()

grid() 函数是一种基于网格式的布局管理方法,相当于把窗口看成了一张由行和列组成的表格。当使用该 grid 函数进行布局的时,表格内的每个单元格都可以放置一个控件,从而实现对界面的布局管理。

注意:这里的所说的“表格”是虚拟出来,目的是便于大家理解,其实窗体并不会因为使用了 gird() 函数,而增加一个表格。

  • 常用参数
属性 说明
column 控件位于表格中的第几列,窗体最左边的为起始列,默认为第 0 列
columnsapn 控件实例所跨的列数,默认为 1 列,通过该参数可以合并一行中多个领近单元格。
ipadx,ipady 用于控制内边距,在单元格内部,左右、上下方向上填充指定大小的空间。
padx,pady 用于控制外边距,在单元格外部,左右、上下方向上填充指定大小的空间。
row 控件位于表格中的第几行,窗体最上面为起始行,默认为第 0 行
rowspan 控件实例所跨的行数,默认为 1 行,通过该参数可以合并一列中多个领近单元格。
sticky 该属性用来设置控件位于单元格那个方位上,参数值和 anchor 相同,若不设置该参数则控件在单元格内居中

注意:这里有一点需要大家要特别注意,在一个程序中不能同时使用 pack() 和 grid() 方法,这两个方法只能二选一,否则程序会运行错误。

  • 示例
from tkinter import *
#主窗口
win = Tk()
win.config(bg='#87CEEB')
win.title("C语言中文网")
win.geometry('500x350+300+300')
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
#在窗口内创建按钮,以表格的形式依次排列
for i in range (10):
    for j in range (10):
        Button (win, text=" (" + str(i) + ","+ str(j)+ ")",bg='#D1EEEE') .grid(row=i,column=j)
# 在第5行第11列添加一个Label标签
Label(win,text="C语言中文网",fg='blue',font=('楷体',12,'bold')).grid(row =4,column=11)
#开始窗口的事件循环
win. mainloop()

image-20220512190242972

当使用 grid 函数布局的时,其实就是为各个控件指定行号、列号的过程,我们不需要为每个单元格指定大小,因为 grid 会为每个单元格自动设置一个适合的尺寸。

  • 简易登录程序
import tkinter as tk
from tkinter import messagebox
root = tk.Tk()
root.title("C语言中文网")
root.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
root.resizable(0,0)
tk.Label(root, text="用户名").grid(row=0, sticky="w")
tk.Label(root, text="密码").grid(row=1, sticky="w")
tk.Entry(root).grid(row=0, column=1)
tk.Entry(root, show="*").grid(row=1, column=1)
# 加载图片LOGO,注意这里是gif格式的图片
photo = tk.PhotoImage(file="C:/Users/Administrator/Desktop/1.gif")
tk.Label(root, image=photo).grid(row=0, column=2, rowspan=2, padx='4px', pady='5px')
# 编写一个简单的回调函数
def login():
    messagebox.showinfo('欢迎来到C语言中文网')
# 使用grid()函数来布局,并控制按钮的显示位置
tk.Button(root, text="登录", width=10, command=login).grid(row=3, column=0, columnspan=2,sticky="w", padx=10, pady=5)
tk.Button(root, text="退出", width=10, command=root.quit).grid(row=3, column=1, columnspan=2,sticky="e", padx=10, pady=5)
# 开启事件主循环
root.mainloop()

image-20220512190348426

  • place()

与前两种布局方法相比,采用 place() 方法进行布局管理要更加精细化,通过 place() 布局管理器可以直接指定控件在窗体内的绝对位置,或者相对于其他控件定位的相对位置。

  • 常用属性
属性 说明
anchor 定义控件在窗体内的方位,参数值N/NE/E/SE/S/SW/W/NW 或 CENTER,默认值是 NW
bordermode 定义控件的坐标是否要考虑边界的宽度,参数值为 OUTSIDE(排除边界) 或 INSIDE(包含边界),默认值 INSIDE。
x、y 定义控件在根窗体中水平和垂直方向上的起始绝对位置
relx、rely 1. 定义控件相对于根窗口(或其他控件)在水平和垂直方向上的相对位置(即位移比例),取值范围再 0.0~1.0 之间 2. 可设置 in_ 参数项,相对于某个其他控件的位置
height、width 控件自身的高度和宽度(单位为像素)
relheight、relwidth 控件高度和宽度相对于根窗体高度和宽度的比例,取值也在 0.0~1.0 之间

通过上述描述我们知道,relxrely参数指定的是控件相对于父组件的位置,而relwidthrelheight参数则是指定控件相对于父组件的尺寸大小。

注意:这里父组件指的是当前可操作控件的上层组件,比如在没有使用容器控件(frame)的窗体中,控件的父组件就是主窗口本身,在《Tkinter布局管理容器控件》一节会做针对性介绍。

  • 示例
from tkinter import *
#主窗口
win = Tk()
win.title("C语言中文网")
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
#创建一个frame窗体对象,用来包裹标签
frame = Frame (win, relief=SUNKEN, borderwidth=2, width=450, height=250)
# 在水平、垂直方向上填充窗体
frame. pack (side=TOP, fill=BOTH, expand=1)
# 创建 "位置1"
Label1 = Label ( frame, text="位置1",bg='blue',fg='white')
# 使用 place,设置第一个标签位于距离窗体左上角的位置(40,40)和其大小(width,height)
# 注意这里(x,y)位置坐标指的是标签左上角的位置(以NW左上角进行绝对定位,默认为NW)
Label1.place (x=40,y=40, width=60, height=30)
# 设置标签2
Label2 = Label (frame, text="位置2",bg='purple',fg='white')
# 以右上角进行绝对值定位,anchor=NE,第二个标签的位置在距离窗体左上角的(180,80)
Label2.place(x=180,y=80, anchor=NE, width=60, height=30)
# 设置标签3
Label3 = Label (frame, text="位置3",bg='green',fg='white')
# 设置水平起始位置相对于窗体水平距离的0.6倍,垂直的绝对距离为80,大小为60,30
Label3.place(relx=0.6,y=80, width=60, height=30)
# 设置标签4
Label4 = Label (frame, text="位置4",bg='gray',fg='white')
# 设置水平起始位置相对于窗体水平距离的0.01倍,垂直的绝对距离为80,并设置高度为窗体高度比例的0.5倍,宽度为80
Label4.place(relx=0.01,y=80,relheight=0.4,width=80)
#开始事件循环
win. mainloop()

image-20220512190531984

注意:在一个父组件中 place()方法可以与 grid() 方法混合使用,要与 pack() 进行区别。

20.16 Tkinter布局管理控件

四种常用的容器控件以及它们的使用方法,分别是 Frame、LabelFrame、PanedWindow 以及 Toplevel。

  • Frame控件

Frame 本质上也是一个矩形窗体,同其他控件一样也需要位于主窗口内。我们可以在主窗口内放置多个 Frame 控件,并且每个 Frame 中还可以嵌套一个或者多个Frame,从而将主窗口界面划分成多个区域。

  • 常用属性
属性 说明
bg 设置 Frame 的背景颜色
bd 指定 Frame 的边框宽度
colormap 指定 Frame 组件及其子组件的颜色映射
container 布尔值参数,若参数值为 True,则窗体将被用作容器使用,一些其他程序也可以被嵌入。
cursor 指定鼠标在 Frame 上飘过的鼠标样式,默认由系统指定
height/width 设置 Frame 的高度和宽度
highlightbackground 指定当 Frame 没有获得焦点的时候高亮边框的颜色,通常由系统指定为标准颜色
highlightcolor 指定当 Frame 获得焦点的时候高亮边框的颜色
highlightthickness 指定高亮边框的宽度,默认值是 0
padx/pady 距离主窗口在水平/垂直方向上的外边距
relief 指定边框的样式,参数值 "sunken","raised","groove" 或 "ridge","flat",默认为 "falt'
takefocus 布尔值参数,默认为 False,指定该组件是否接受输入焦点(即用户通过 Tab 键将焦点转移上来)
  • 示例
import tkinter as tk
win = tk.Tk()
win.title("C语言中文网")
win.geometry('400x350+200+200')
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
# 在主窗口上添加一个frame控件
frame1 = tk.Frame(win)
frame1.pack()
# 在frame_1上添加另外两个frame, 一个在靠左,一个靠右
#左侧的frame
frame_left = tk.Frame(frame1)
tk.Label(frame_left,text='左侧标签1',bg='green',width=10,height=5).grid(row =0,column=0)
tk.Label(frame_left,text='左侧标签2',bg='blue',width=10,height=5).grid(row = 1 ,column =1)
frame_left.pack(side=tk.LEFT)
frame_right = tk.Frame(frame1)
tk.Label(frame_right,text='右侧标签1',bg='gray',width=10,height=5).grid(row = 0 ,column =1)
tk.Label(frame_right,text='右侧标签2',bg='pink',width=10,height=5).grid(row = 1 ,column =0)
tk.Label(frame_right,text='右侧标签3',bg='purple',width=10,height=5).grid(row= 1,column=1)
frame_right.pack(side=tk.RIGHT)
win.mainloop()

image-20220512190741549

上述示例利用 Frame 控件将主窗口分成了左右两个子区域,同时在各自区域中添加了 Label 标签,而且区域之间互不干扰。采用这种分区、分块的布局方式,可以使得 GUI 程序更加规范、简洁化。

  • LabelFrame控件

LabelFrame 控件也是一种容器类型的控件,它属于是 Frame 控件的变体,因此它们的属性选项大体相同。

在默认情况下,LabelFrame 会在其包裹的子组件周围绘制一个边框和一个标题。当我们想要将一些相关的组件分为一组时,就可以使用 LabelFrame 组件,比如把一系列 Radiobutton(单选按钮)放在一起来供用户选择。

  • 示例

同 Frame 控件一样,LabelFrame 的主要作用也是对控件进行分组处理

import tkinter as tk
win = tk.Tk()
win.title("C语言中文网")
win.geometry('800x350+200+200')
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
# 定义第一个容器,使用 labelanchor ='w' 来设置标题的方位
frame_left = tk.LabelFrame(win, text="教程", labelanchor="w",bg='#5CACEE')
# 使用 place 控制 LabelFrame 的位置
frame_left.place(relx=0.2, rely=0.2, relwidth=0.2, relheight=0.5)
label_1 = tk.Label(frame_left, text="C语言")
label_1.place(relx=0.2, rely=0.2)
label_2 = tk.Label(frame_left, text="Python")
label_2.place(relx=0.6, rely=0.2)
label_3 = tk.Label(frame_left, text="Java")
label_3.place(relx=0.2, rely=0.6)
label_4 = tk.Label(frame_left, text="C++")
label_4.place(relx=0.6, rely=0.6)
# 定义第二个容器,使用 labelanchor ='w' 来设置标题的方位
frame_right = tk.LabelFrame(win, text="辅导班", labelanchor="w",bg='#66CDAA')
# 使用 place 控制 LabelFrame 的位置
frame_right.place(relx=0.5, rely=0.2, relwidth=0.3, relheight=0.6)
label_1 = tk.Label(frame_right, text="C语言辅导班")
label_1.place(relx=0.2, rely=0.2)
label_2 = tk.Label(frame_right, text="数据结构")
label_2.place(relx=0.6, rely=0.2)
label_3 = tk.Label(frame_right, text="C++辅导班")
label_3.place(relx=0.2, rely=0.6)
label_4 = tk.Label(frame_right, text="Python答疑")
label_4.place(relx=0.6, rely=0.6)
win.mainloop()

image-20220512190841620

  • PanedWindow控件

PanedWindow(窗格界面)也可以理解成一个特殊的 Frame 控件,它是 Tkinter 8.4 版本后新增的空间管理组件,其主要目的是为其他组件提供一个容器或者框架,从而实现以分块的形式对图形界面进行布局。

与 Frame 控件不同, PanedWindow 允许用户自主地调整界面划分以及每块区域的大小。因此,当您需要让用户自己调节每块区域的大小时,就可以采用 PanedWindow 作为组件载体来进行界面的布局。

不仅如此 PanedWindow 组件还提供了“手柄” 功能(设置参数 showhandle=True 来启用),通过拖动“手柄”图标也可以改变每块区域的大小。PanedWindow 组件语法格式如下所示:

PanedWindow(master=None, **options) 

其中 master 表示父组件,即包裹该组件的上层组件。其常用属性如下表所示:

属性 说明
handlepad 1. 调节“手柄”的位置 2. 比如当 orient ='vertical' 设置垂直时,handlepad 表示“分割线”上的手柄与左端的距离,默认为 8 像素
handlesize 设置“手柄”的尺寸(由于“手柄”必须是一个正方形,所以是设置正方形的边长)默认为 8 像素
opaqueresize 1. 该选项定义了用户调整窗格尺寸的操作,如果该选项的值为 True(默认),窗格的尺寸随用户鼠标的拖拽而改变 2. 如果该选项的值为 False,那么窗格的尺寸,在用户释放鼠标时才会更新到新的位置上
orient 指定窗格的分布方式,默认为水平方向分布("horizontal"),或者还可以设置为垂直纵向分布("vertical")
relif 指定边框的样式,默认为 "flat",还可以设置为 "sunken","raised","groove" 或 "ridge"
sashpad 设置每一条分割线到窗格间的间距
sashrelief 设置分割线的样式,默认值是:"flat",还可以设置 "sunken","raised","groove" 或 "ridge"
sashwidth 设置分割线的宽度
showhandle 设置是否显示调节窗格的手柄,默认为 False
height/width 设置 PanedWindow 的高度、宽度,若不设置,则其大小由其子组件的尺寸决定

PanedWindow 的常用方法如下表所示:

方法 说明
add(child) 添加一个新的子组件到窗格中语法格式 add(child,**option),参数值 after、before、sticky
forget(child) 删除一个子组件
panecget(child, option) 获得子组件指定选项的值
paneconfig(child, **options) 设置子组件的各种选项
panes() 将父组件中包含的子组件以列表的形式返回
sash_coord(index) 返回一个二元组表示指定分割线的起点坐标
sash_place(index, x, y) 将指定的分割线移动到一个新的位置
  • 示例

下面示例设计一个简单的界面布局,然后将图形界面分割成四部分:创建一个水平方向的 PanedWindow,并向其中添加两个 Label 组件,之后创建一个垂直的方向的 PanedWindow,并向其中中添加两个 Label 标签。

import tkinter as tk
win = tk.Tk()
win.title("C语言中文网")
win.geometry('400x400+200+200')
win.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
# 创建一个水平方向的 panedwindow,并添加到主窗口中,默认为水平方向
p_window1 = tk.PanedWindow(win)
p_window1.pack(fill=tk.BOTH, expand=1)
# 在窗口区的左侧添加两个水平方向的 Label
left1 =tk. Label(p_window1, text='C语言中文网', bg='#7CCD7C', width=10,font=('微软雅黑',15))
p_window1.add(left1)
left2 =tk.Label(p_window1, text='网址:c.biancheng.net', bg='#9AC0CD', width=10,font=('微软雅黑',15))
p_window1.add(left2)
# 创建一个垂直方向的panedwindow,并添加一个手柄,设置分割线样式
p_window2 = tk.PanedWindow(orient=tk.VERTICAL,showhandle=True,sashrelief='sunken')
# 添加到 p_window1中
p_window1.add(p_window2)
# 在 p_window2 中添加两个垂直方向的标签
top_label =tk. Label(p_window2, text='教程', bg='#7171C6', height=8,font=('宋体',15))
p_window2.add(top_label)
bottom_label =tk. Label(p_window2, text='辅导班', bg='#8968CD',font=('宋体',15))
p_window2.add(bottom_label)
win.mainloop()

image-20220512191026894

注意:从上述示例中可以看出 PanedWindw 会为每一个 Label 控件创建一个独立的窗格, 当我们将鼠标悬停在两个控件接壤处的白色边框上时,就会出现可以上下或者左右拉伸的指示光标,用户按照可以按照自己的意愿来调整每块区域的大小。

  • Toplevel控件

Topleve 是一个顶级窗口控件(也被称为“子窗体”控件),同样类似于 Frame 控件, 不过该控件会脱离根窗口另行创建一个独立窗口,因此它的存在形式不同于上述其他容器。

Toplevel 控件同样隶属于主窗口的子组件,只是存在形式特殊而已。Toplevel 是主窗口之外的弹出框窗口(通过事件来触发执行),在这个窗口内也可以包含其他组件。但需要注意,顶级窗口并不是必须位于窗口的顶部位置,之所以称其为顶级窗口,是因为相对于主窗口而言,Topleve 位于主窗口的上一层。

Toplevel 控件拥有根窗口控件的所有方法和属性,同时它还拥有一些独有的方法,如下表所示:

方法 说明
deiconify() 在使用 iconify() 或 withdraw() 方法后,即窗口最小化和移除窗口后(只是看不见,并没销毁),使用该方法来显示该窗口
frame() 返回一个系统特定的窗口识别码
group(window) 将顶级窗口加入 window 窗口群组中,如果忽略该参数,将返回当前窗口群的主窗口
iconify() 将窗口图标化(最小化),需要重新显示窗口,使用 deiconify() 方法
protocol(name, function) 将回调函数 function 与相应的规则 name 绑定; 1) name 参数可以是 "WM_DELETE_WINDOW":窗口被关闭的时候; 2) name 参数可以是 "WM_SAVE_YOURSELF":窗口被保存的时候; 3) name 参数可以是 "WM_TAKE_FOCUS":窗口获得焦点的时候。
state() 设置和获得当前窗口的状态,参数值 "normal"(正常状态),"withdrawn(移除窗口)","icon"(最小化)和 "zoomed"(放大)
transient(master) 指定为 master 的临时窗口
withdraw() 将窗口从屏幕上移除,只是移动到了窗口之外,并没销毁,需要重新显示窗口,使用 deiconify() 方法
  • 示例
import tkinter as tk
root = tk.Tk()
root.config(bg='#87CEEB')
root.title("C语言中文网")
root.geometry('400x350+300+300')
root.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
def create_toplevel():
    top = tk.Toplevel()
    top.title("C语言中文网")
    top.geometry('300x200+100+100')
    top.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
    # 多行文本显示Message控件
    msg = tk.Label(top, text="网址:c.biancheng.net",bg='#9BCD9B',font=('宋体',15))
    msg.pack()
tk.Button(root, text="点击创建Toplevel组件", width=20,height=3,command=create_toplevel).pack()
root.mainloop()

image-20220512191130426

20.17 Tkinter对话框控件

除了基本的控件之外,Tkinter 还提供了三种对话框控件:

  • 文件选择对话框:filedailog
  • 颜色选择对话框:colorchooser
  • 消息对话框:messagebox
  • 文件选择对话框

文件对话框在 GUI 程序中经常的使用到,比如上传文档需要从本地选择一个文件,包括文件的打开和保存功能都需要一个文件对话框来实现。Tkinter 提供文件对话框被封装在tkinter.filedailog模块中,该模块提供了有关文件对话框的常用函数,经常使用的有以下几个:

方法 说明
Open() 打开个某个文件
SaveAs() 打开一个保存文件的对话框
askopenfilename() 打开某个文件,并以包函文件名的路径作为返回值
askopenfilenames() 同时打开多个文件,并以元组形式返回多个文件名
askopenfile() 打开文件,并返回文件流对象
askopenfiles() 打开多个文件,并以列表形式返回多个文件流对象
asksaveasfilename() 选择以什么文件名保存文件,并返回文件名
asksaveasfile() 选择以什么类型保存文件,并返回文件流对象
askdirectory 选择目录,并返回目录名

上述方法的常用参数值如下所示:

参数 说明
defaultextension 指定文件的后缀名,当保存文件时自动添加文件名,如果自动添加了文件的后缀名,则该选项值不会生效
filetypes 指定筛选文件类型的下拉菜单选项,该选项值是由 2 元祖构成的列表,其中每个二元祖由两部分组成 (类型名,后缀),比如 filetypes = [("PNG",".png"), ("JPG", ".jpg"), ("GIF",".gif"),("文本文件",".txt")...]
initialdir 指定打开/保存文件的默认路径,默认路径是当前文件夹
parent 如果不指定该选项,那么对话框默认显示在根窗口上,通过设置该参数可以使得对话框显示在子窗口上
title 指定文件对话框的标题
  • 实例
from tkinter import *
import tkinter.filedialog  # 注意次数要将文件对话框导入
# 定义一个处理文件的相关函数
def askfile():
    # 从本地选择一个文件,并返回文件的目录
    filename = tkinter.filedialog.askopenfilename()
    if filename != '':
         lb.config(text= filename)
    else:
         lb.config(text='您没有选择任何文件')
root = Tk()
root.config(bg='#87CEEB')
root.title("C语言中文网")
root.geometry('400x200+300+300')
root.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
btn=Button(root,text='选择文件',relief=RAISED,command=askfile)
btn.grid(row=0,column=0)
lb = Label(root,text='',bg='#87CEEB')
lb.grid(row=0,column=1,padx=5)
# 显示窗口
root.mainloop()

image-20220512191454656

  • ‘保存文件’实例
import tkinter as tk
from tkinter import filedialog
from PIL import Image
def open_img():
    try:
        global img
        filepath = filedialog.askopenfilename() # 打开文件,返回该文件的完整路径
        filename.set(filepath)
        img = Image.open(filename.get())
    except Exception as e:
        print("您没有选择任何文件",e)
def save_png():
    try:
        filetypes = [("PNG","*.png"), ("JPG", "*.jpg"), ("GIF","*.gif"),("txt files","*.txt"),('All files','*')]
        # 返回一个 pathname 文件路径字符串,如果取消或者关闭则返回空字符,返回文件如何操作是后续代码的事情,
        # 该函数知识返回选择文件的文件名字,不具备保存文件的能力
        filenewpath= filedialog.asksaveasfilename(title='保存文件',
                                                filetypes=filetypes,
                                                defaultextension='.png',
                                                initialdir='C:/Users/Administrator/Desktop' )
        path_var.set(filenewpath)
        # 保存文件
        img.save(str(path_var.get()))
    except Exception as e:
        print(e)
window = tk.Tk()
window.title("C语言中文网")
window.geometry('400x200+300+300')
window.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
filename = tk.StringVar()
path_var = tk.StringVar()
# 定义读取文件的组件
entry = tk.Entry(window, textvariable=filename)
entry.grid(row=1, column=0, padx=5, pady=5)
tk.Button(window, text='选择文件', command=open_img).grid(row=1, column=1, padx=5, pady=5)
# 定义保存文件的组件
entry1 = tk.Entry(window, textvariable=path_var)
entry1.grid(row=2, column=0, padx=5, pady=5)
tk.Button(window, text='保存文件', command=save_png).grid(row=2, column=1, padx=5, pady=5)
window.mainloop()

image-20220512191525562

  • 颜色选择对话框

颜色选择对话框(colorchooser),提供了一个非常友善的颜色面板,它允许用户选择自己所需要的颜色。 当用户在面板上选择一个颜色并按下“确定”按钮后,它会返回一个二元祖,其第 1 个元素是选择的 RGB 颜色值,第 2 个元素是对应的 16 进制颜色值。

颜色选择对话款主要应用在画笔、涂鸦等功能上,通过它可以绘制出五彩缤纷的颜色,该对话框的使用非常简单,主要有以下两个常用方法:

方法 说明
askcolor() 打开一个颜色对话框,并将用户选择的颜色值以元组的形式返回(没选择返回None),格式为((R, G, B), "#rrggbb")
Chooser() 打开一个颜色对话框,并用户选择颜色确定后,返回一个二元组,格式为((R, G, B), "#rrggbb")

常用的颜色对话框的参数值如下表所示:

属性 说明
default 要显示的初始的颜色,默认颜色是浅灰色(light gray)
title 指定颜色选择器标题栏的文本,默认标题为“颜色”
parent 1. 如果不指定该选项,那么对话框默认显示在根窗口上 2. 如果想要将对话框显示在子窗口上,那么可以设置 parent = 子窗口对象
  • 示例
import tkinter as tk
from tkinter import colorchooser
root = tk.Tk()
root.title("颜色选择")
root.geometry('400x200+300+300')
root.iconbitmap('C:/Users/Administrator/Desktop/C语言中文网logo.ico')
def callback():
    # 打开颜色对话款
    colorvalue = tk.colorchooser.askcolor()
    # 在颜色面板点击确定后,会在窗口显示二元组颜色值
    lb.config(text='颜色值:'+ str(colorvalue))
lb=tk.Label(root,text='',font=('宋体',10))
# 将label标签放置在主窗口
lb.pack()
tk.Button(root, text="点击选择颜色", command=callback, width=10, bg='#9AC0CD').pack()
# 显示界面
root.mainloop()

image-20220512191711081

  • 消息对话框

关于消息对话款(messagebox),在前面介绍其他控件时已经使用过,在本节仅对它做简单介绍。

消息对话框主要起到信息提示、警告、说明、询问等作用,通常配合“事件函数”一起使用,比如执行某个操作出现了错误,然后弹出错误消息提示框。通过使用消息对话框可以提升用户的交互体验,也使得 GUI 程序更加人性化。消息对话框主要包含了以下常用方法:

方法 说明
askokcancel(title=None, message=None) 打开一个“确定/取消”的对话框
askquestion(title=None, message=None) 打开一个“是/否”的对话框。
askretrycancel(title=None, message=None) 打开一个“重试/取消”的对话框
askyesno(title=None, message=None) 打开一个“是/否”的对话框
showerror(title=None, message=None) 打开一个错误提示对话框
showinfo(title=None, message=None) 打开一个信息提示对话框
showwarning(title=None, message=None) 打开一个警告提示对话框

上述方法拥有相同的选项参数,如下表所示:

属性 说明
default 1. 设置默认的按钮(也就是按下回车响应的那个按钮) 2. 默认是第一个按钮(像“确定”,“是”或“重试”) 3. 可以设置的值根据对话框函数的不同,可以选择 CANCEL,IGNORE,OK,NO,RETRY 或 YES
icon 1. 指定对话框显示的图标 2. 可以指定的值有:ERROR,INFO,QUESTION 或 WARNING 3. 注意:不能指定自己的图标
parent 1. 如果不指定该选项,那么对话框默认显示在根窗口上 2. 如果想要将对话框显示在子窗口上,那么可以设置 parent= 子窗口对象

上述方法的返回值一般会是一个布尔值,或者是“YES”,“NO”,“OK”等,这些方法使用较为简单,此处不进行逐一列举,看个简单的示例即可:

import tkinter.messagebox
result=tkinter.messagebox.askokcancel ("提示"," 你确定要关闭窗口吗? ")
# 返回布尔值参数
print(result)

image-20220512191813103

标签:总结,控件,python,win,text,tk,使用,import,root
From: https://www.cnblogs.com/hnu-hua/p/18162328

相关文章

  • python学习思维导图分享
    python本文包含了我的一些python学习的笔记和思维导图第一部分:python基础导图下载链接第二部分:函数及其他文件操作导图下载链接第三部分:类及网络编程导图下载链接第四部分:mysql导图下载链接......
  • 深入理解Python协程:从基础到实战
    title:深入理解Python协程:从基础到实战date:2024/4/2716:48:43updated:2024/4/2716:48:43categories:后端开发tags:协程异步IO并发编程Pythonaiohttpasyncio网络爬虫第1章:协程基础1.1协程概念介绍协程(Coroutines)是一种特殊的软件构造,它允许程序在执......
  • 使用Redis实现游戏排行榜
    排行榜在当今应用中扮演着至关重要的角色。无论是游戏中的玩家排名、社交平台的用户活跃度榜单,还是其他领域的各种榜单,排行榜都是用户参与性和互动性的关键。在实现排行榜功能时,选择合适的数据库和数据结构至关重要。Redis,作为一种内存数据库,以其高性能和灵活性而备受青睐。下面将......
  • Git 使用教程(新手学习)
    Git是一种分布式版本控制系统,用于管理软件项目的源代码。它是由Linux之父LinusTorvalds开发的,并已经成为了现代软件开发领域中最流行的版本控制系统之一。使用Git可以追踪代码的历史修改记录,方便团队协作、代码共享和代码重构。Git的基本工作流程如下:在开始编写代码之......
  • WPF所有原生空间使用demo
    //前台窗体<Windowx:Class="WpfTestDemo.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.......
  • Go的Gin框架中使用Cgo调用Python的CApi调用Python代码
    在Gin项目中定义Services用以唤起Python,值得注意的是需要在引入Python.h前使用#cgo声明依赖库packagecpython//#cgoCFLAGS:-I"Q:/Sill-/anaconda/envs/poetry/include"//#cgoLDFLAGS:-L"Q:/Sill-/anaconda/envs/poetry/libs"-lpython311//#include<Python.h>imp......
  • .NET项目中NLog的配置与使用
    因为之前在项目开发中一直都是使用的Log4Net作为项目的日志记录框架,最近忽然感觉对它已经有点腻了,所以尝试着使用了NLog作为新项目的日志记录框架(当然作为一名有志向的攻城狮永远都不能只局限于眼前的技术,要不断的使用和学习新的技术)。当然serilog也是一个不错的日志记录框......
  • Python (GUI编程)模块 使用方法
    GraphicalUserInterface,简称GUI,中文名为图形用户界面,又称图形用户接口,是一种通过图形元素(如按钮、文本框、图像等)来与计算机程序进行交互的方式。与传统的命令行界面相比,GUI更加直观和易于使用,因为用户可以直接通过点击、拖拽等方式来完成任务,而无需记忆和输入复杂的命令。GUI......
  • Python 潮流周刊#48:Python 3.14 的发布计划
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。本期分享了12篇文章,11个开源项目,赠书5本《图解TCP/IP(第6版)》,以下是周刊......
  • [SUCTF 2019]Pythonginx
    [SUCTF2019]Pythonginx打开环境@app.route('/getUrl',methods=['GET','POST'])defgetUrl():url=request.args.get("url")host=parse.urlparse(url).hostname//urlparse对url中的各个组成部分进行分割ifhost=='suctf......