提示:本博客作为学习笔记,有错误的地方希望指正,此文可能会比较长,作为学习笔记的积累,希望对来着有帮助。
绪论:笔者这里使用的是QTCreator和Python来实现一个简单的串口上位机的开发的简单过程,使用到Python,之前记录的Qt 使用C++ 写上位机也记录一篇文章,大家感兴趣的话可以看看。从零开始编写一个上位机(串口助手)QT Creator + C++,这里我使用Python写上位机主要的原因就是Python强大的数据抓取能力以及数据处理能力,我们可以使用Python做上位机作为自动化测试工具,采集之后的数据整合都是 非常强大的,因为Python和C++都是高级语言,所以和前面叙述使用C++写上位机的流程有许多相似之处。唯一的差别就是想要使用QT 写上位机的话默认语言就是C++ 的,我们需要一个工具将QT设计的界面翻译成Python,后续就直接可以使用Python 引用我们使用QT设计的界面元素,对界面元素的数据处理以及数据交互实现控制;将C++转化成Python 目前主流的有PyQT和Pyside,至于PyQT5、PyQT6、Pyside2、Pyside6只是版本不同而已,至于两者的主要差别PyQT5是第三方机构最初开始去做的,起步比较早资料比较完善,但是会收费的,Pyside 主要是Python 他们自己去维护的,相当于Python的亲儿子PyQT相当于干儿子,所以目前大家都比较看好Pyside,我这里是使用的Pyside2 其实目前Pyside 和PyQT大部分是兼容的,你只需要将PyQT的名字改为Pyside就可以了。
文章目录
一、Python知识
1、初识Python
对于Python而言,和C++一样的都是高级语言,都是面向对象的语言。
2、Python输入输出控制
Python中使用input和print实现输入输出控制,输入input默认类型是str类型的,需要其他类型需要做数据类型的转换。
2.1、Python的输入input
输入input() 注意 输入默认式 str类型的,需要其他类型需要类型转换
name = input("请输入你的名字>>")
print(name)
password = input("请输入你的密码>>")
print(password)
print(type(password)) # <class 'str'>
2.2、Python的输出控制print
Python的输出控制使用的是print来实现输出显示的,和C一样的可以使用控制输出符实现对输出格式的控制。Python的输出print的输出控制有许多种类别。直接使用占位符实现输出、使用xxx.format形式、使用f"{}"的形式。速度对比f’{}‘>str.format()(推荐使用)>%(占位符),值得注意的是下面使用到字符串的显示,字符串通常可以 ”(字符串)“、’(字符串)‘、’‘’(字符串)‘’'三种形式显示字符串,最后这种可以显示多行换行形式的字符串。
2.2.1、使用占位符输出% 占位符有%s %d %f
name = input("name:")
age = input("age:")
job = input("Job:")
hobbies = input("hobbies:")
info = '''
---------------info of------------
Name :%s #代表name
Age :%s #代表Age
Job :%s #代表Job
Hobbies :%s #代表Hobbies
'''%(name,age,job,hobbies)
print(info)
msg = "my name is %s"%('shawn')
print(msg) # my name is shawn
msg = "my name is %s,my age is %s"%('shawn',22)
print(msg) # my name is shawn,my age is 22
2.2.2、使用xxx.format形式
msg = "my name is {}".format('shawn')
print(msg) # my name is shawn
msg = "my name is {} my age is {}".format('shawn',18)
print(msg) # my name is shawn my age is 18
msg = "my name is {0} my age is {1} {1}".format('shawn',18)
print(msg) # my name is shawn my age is 18 18
2.2.3、f"{}"的形式
name = 'shawn'
age = 18
print(f"my name is {
name} my age is {
age}") # my name is shawn my age is 18
3、Python的数据结构
3.1、数字
在Python中例如(2、4、6)归类为int整形数据,带有小数的数字(3.14、9.9)称之为float(浮点型)。在Python3中使用 ”/“ 返回的永远是一个浮点型,想要除法最后获得整形类型就使用”//“,即可实现,但是最后的整形数据是直接截掉后面的小数,不是四舍五入之后的数据;想要获取两数之后的余数使用”%“即可实现。实现指数运算直接使用”**“来实现。此外python还支持复数来定义虚实部计算。
print(7 / 3)
print(7 // 3)
print(7 % 3)
print(7 ** 3)
输出结果:
2.3333333333333335
2
1
343
3.2、字符串
在Python中可以使用”‘’“(单引号)或““””(双引号)括起来代表字符串,也可以使用”\“来对特殊的字符转意,如果想要表示多行字符串,就可以使用” “”“…”“” “ 三个双引号或者” ‘’‘…’‘’ “ 三个单引号把字符串扩起来,每行结尾都会被自动加上一个换行符,如果不想输出换行符可以在每行的最后加入 ”\“ 来避免输出行换。
print("""
How are you?\
I`m fine.
""")
print("""
How are you?
I`m fine.
""")
3.3、数据结构之通用序列操作
Python中有六种内置序列,其中三种基本序列类型比较常见:列表、元组、字符串,大部分序列都可以进行通用操作,包括索引、切片、相同序列相加、乘法、成员资格、长度、最大值、最小值。
3.3.1、索引
序列的每一个元素都会为其分配一个数字,代表序列中的索引的位置,Python中的索引和C语言的素组一样的从下标0开始的。不仅可以正数,还可以倒数,负数时候索引的值从右往左的顺序。
x1 = [1, 2, 3, 4]
print("列表", x1[0])
x2 = (1, 2, 3, 4)
print("元组", x2[0])
print("元组", x2[-1])
输出结果:
列表值 1
元组值 1
元组值 4
3.3.2、切片
利用切片我们可以连续的获取或者输出一段序列的内容,在Python中所有的序列类型都可以支持切片操作。切片主要有三个参数组成 切片索引开始值 :切片索引结束值 :切片步距 固定格式就是这样的但是我们并不一定看到的都是这样的格式,可以进行一些简写格式的输出。
x1 = [1, 2, 3, 4, 5, 6, 7, 8]
print(x1[:]) # 全切片
print(x1[0:7:2]) # 指定开始结束位置以及步距的切片
print(x1[3:]) # 指定开始默认一直到结束 步距默认为1
print(x1[:3]) # 指定结束位置默认索引从0下标开始算起 步距默认为1
print(x1[3:5]) # 指定开始结束位置 步距默认为1 位置为左开右闭 即第五位不输出,索引从0下标开始算起 索引数字3的时候开始切片 数字5的时候结束,但不包括索引下标5所对应的值
print(x1[-6:5]) # 切片值支持负数索引
输出结果:
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 3, 5, 7]
[4, 5, 6, 7, 8]
[1, 2, 3]
[4, 5]
[3, 4, 5]
3.3.3、序列相加
序列相加直接可以使用 ”+“进行连接操作。
x1 = [1, 2, 3, 4, 5, 6, 7, 8]
x2 = [9, 10, 11, 12, 13, 14]
x3 = x1 + x2
print(x3)
输出结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
3.3.3、序列重复
序列重复直接使用 “*” 星号叫做乘号
x1 = [1, 2, 3, 4, 5, 6, 7, 8]
x3 = x1 * 2
print(x3)
输出结果:
[1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8]
3.3.4、成员资格
成员资格使用 “in” 来判断一个元素是否包含在序列中,如果包含则返回True,不包含则返回False ,但是在进行包含判断的只有元素的类型和值完全一致的时候次才可以实现包含,例如不能使用字符5和数字5来处理包含关系。
x1 = [1, 2, 3, 4, 5, 6, 7, 8]
print("5是否包含在x1 列表中", 5 in x1)
print("10是否包含在x1 列表中", 10 in x1)
输出结果:
5是否包含在x1 列表中 True
10是否包含在x1 列表中 False
3.3.4、长度、最值、求和
x1 = [1, 2, 3, 4, 5, 6, 7, 8]
print("x1列表长度值", len(x1))
print("x1列表最大值", max(x1))
print("x1列表最小值", min(x1))
print("x1列表总和值", sum(x1))
输出结果:
x1列表长度值 8
x1列表最大值 8
x1列表最小值 1
x1列表总和值 36
3.4、列表
列表在Python中的功能是非常强大的,也是Python中重要的数据结构。列表也可以通过索引来获取和设置数,我们还可以增删和查找列表中的数据。列表不单纯是一类数据还可以是多种类型的数据。
3.4.1、新增元素
Python中的新增数据可以使用append来添加,但是只在列表中新增一个元素,想要新增多个元素的话还的使用extend,append无论后面是一个列表都只能按照一个元素新增上去,extend则是打散之后加载在原来的列表后面。使用append和extend都是只能在列表的最后面添加元素,我们可以使用insert在指定的序列添加指定的数据。insert和append一样的一此只能插入一个数据,insert插入的序列下标还是从0开始计算的。
x1 = [1, 2, 3, 4, 5, 6, 7, 8]
print("x1修改前的数据", x1)
x1[3] = "Hello"
print("x1修改后的数据", x1)
x1.append("Python")
print("x1 append 新增后的数据", x1) # append只能新增一个元素
x1.append([168, 99])
print("x1 append 新增后的数据", x1) # append只能新增一个元素
x1.extend([99, 168])
print("x1 extend 新增后的数据", x1) # append只能新增一个元素
x1.insert(1, 66)
print("x1 insert 新增后的数据", x1) # append只能新增一个元素
输出结果:
x1修改前的数据 [1, 2, 3, 4, 5, 6, 7, 8]
x1修改后的数据 [1, 2, 3, 'Hello', 5, 6, 7, 8]
x1 append 新增后的数据 [1, 2, 3, 'Hello', 5, 6, 7, 8, 'Python']
x1 append 新增后的数据 [1, 2, 3, 'Hello', 5, 6, 7, 8, 'Python', [168, 99]]
x1 extend 新增后的数据 [1, 2, 3, 'Hello', 5, 6, 7, 8, 'Python', [168, 99], 99, 168]
x1 insert 新增后的数据 [1, 66, 2, 3, 'Hello', 5, 6, 7, 8, 'Python', [168, 99], 99, 168]
3.4.2、删除元素
对于列表能新增当然也可以删除元素,删除元素可以使用pop和remove来实现,pop是默认删除最后一个元素,并且返回删除的元素值,此外pop也可以通过参数指定删除哪一个数值,remove的话是可以根据值索引删除的。remove删除值之后不会返回删除的值,直接返回一个None,remove删除时候索引找不到该值的时候就会报错。另外也可以使用del来实现列表元素的删除。
x1 = [1, "Hello", 3, 4, 5, 6, 7, 8]
print("使用pop删除之后的返回值", x1.pop())
print("删除之后的值", x1)
print("使用pop删除之后的返回值", x1.pop(0))
print("删除之后的值", x1)
print("使用remove删除之后的返回值", x1.remove("Hello"))
print("删除之后的值", x1)
del x1[4]
print("del删除之后的值", x1)
输出结果:
使用pop删除之后的返回值 8
删除之后的值 [1, 'Hello', 3, 4, 5, 6, 7]
使用pop删除之后的返回值 1
删除之后的值 ['Hello', 3, 4, 5, 6, 7]
使用remove删除之后的返回值 None
删除之后的值 [3, 4, 5, 6, 7]
del删除之后的值 [3, 4, 5, 6]
3.4.3、查找元素
Python中使用index方法查找元素在列表中的索引位置。当查找元素不存在的时候会报错。除此之外列表还有些其他的方法可以操作,例如反转队列reverse、计算元素在列表中出现的次数count、排序sort。注意排序sort的时候需要列表的数据类型一致,不然会报错。
x1 = [1, 2, 3, 4, 5, 6, 7, 8]
print("index 查找元素位置", x1.index(2))
x1.reverse()
print("reverse 反转列表数据", x1)
print("count 计数列表数据值出现次数", x1.count(6))
x1.sort()
print("sort 排序后的列表", x1)
输出结果:
index 查找元素位置 1
reverse 反转列表数据 [8, 7, 6, 5, 4, 3, 2, 1]
count 计数列表数据值出现次数 1
sort 排序后的列表 [1, 2, 3, 4, 5, 6, 7, 8]
3.5、元组
元组与列表十分相似,但是元组与列表最大的区别是列表可以修改、读取、删除,而元组创建之后则不能修改和不能删除单个元素。元组还是有count、和index的可以索引和对元素计数的。
元组的定义只需要使用() 括号扩起来就行了,并且使用 ”,“ 来隔开元素。 如果只有一个元素的时候单单只有一个 ”()“是不够的,还需要加上一个 ”,“才能定义一个元组。
x1 = (1, 2, 3, 6, 9)
print("count 计数元组数据值出现次数", x1.count(6))
print("count 计数元组数据元素的索引值", x1.index(6))
x2 = ("Hello")
x3 = ("Hello",)
print("x2数据类型", type(x2), "x3数据类型", type(x3))
输出结果:
count 计数元组数据值出现次数 1
count 计数元组数据元素的索引值 3
x2数据类型 <class 'str'> x3数据类型 <class 'tuple'>
3.6、字典
字典的类型就和json字符串类似的样子,你可以像查字典一样的使用字典。字典类中的元素由键key和值value构成元素和元素之间使用 ”,“分隔整个字典使用 ”{}“ 花括号来包围。字典中的键必须是唯一的不能重复,如果是空字典的话直接使用 {} 表示。
字典可以通过key值去获取和索引字典元素中的值,此外还可以对字典的数据进行增删操作等等。
- del:来实现对字典的删除
- clear:对字典进行清空处理
- copy:可以实现对字典的复制
- fromkeys:可以实现创建一个字典
- get:放回键对应的值
- keys:返回一个列表,里面包含所有的键,通常判断一个键是否包含于字典中我们只需要得到这个列表在使用 ”in“ 操作即可实现
- value:返回一个列表,包含字典的所有值
- items:方法放回一个列表,包含所有的键和值列表,由于字典不能直接用for循环,通常我们可以使用iteams方法来遍历整个字典
language = {
"chinese": "汉语",
"english": "英语",
"other": "其他语言"
}
print("原来值", language)
print("索引值", language["chinese"])
language["other"] = "鸟语"
print("设定值", language["other"])
language["alien"] = "火星语"
print("新增值", language["alien"])
del language["other"]
print("删除后值", language)
language.clear()
print("clear 后的值", language)
language_key = ("chinese", "english", "other")
language = dict.fromkeys(language_key)
language1 = dict.fromkeys(language_key, "汉语")
language2 = language1.copy()
print("字典language", language, "\n字典language1", language1, "\n字典language2", language2)
print("获取字典language1的值", language1.get("chinese"))
print("chinese 是否存在字典中?", "chinese" in language1.keys())
print("language1 中所有的值", language1.values())
print("使用items遍历字典")
for k, v in language1.items():
print("key:", k, "value:", v)
输出结果:
原来值 {
'chinese': '汉语', 'english': '英语', 'other': '其他语言'}
索引值 汉语
设定值 鸟语
新增值 火星语
删除后值 {
'chinese': '汉语', 'english': '英语', 'alien': '火星语'}
clear 后的值 {
}
字典language {
'chinese': None, 'english': None, 'other': None}
字典language1 {
'chinese': '汉语', 'english': '汉语', 'other': '汉语'}
字典language2 {
'chinese': '汉语', 'english': '汉语', 'other': '汉语'}
获取字典language1的值 汉语
chinese 是否存在字典中? True
language1 中所有的值 dict_values(['汉语', '汉语', '汉语'])
使用items遍历字典
key: chinese value: 汉语
key: english value: 汉语
key: other value: 汉语
3.7、集合
集合的数与列表数据非常类似,集合唯一的区别是不会包含重复的数据。如果是空集合一定要使用set()来定义,如果包含元素则可以使用 “{}” 来定义,在集合中可以使用add来添加对应的元素,也可以使用remove来移除集合中的数,但是不能用来移除不存在的数,不然Python会报错。
empty = set() # 注意空集合不能使用{}定义
print("空集合", empty)
number = {
1, 5, 1, 10}
print("数字集合", number)
mix = {
1, "hello", 3.1415926}
print("混合集合", type(mix), mix)
mix.add("66")
print("添加后的元素", mix)
mix.remove("hello")
print("移除后的元素", mix)
输出结果:
空集合 set()
数字集合 {
1, 10, 5}
混合集合 <class 'set'> {
1, 3.1415926, 'hello'}
添加后的元素 {
1, '66', 3.1415926, 'hello'}
移除后的元素 {
1, '66', 3.1415926}
3.8、推导公式
Python中支持三种推导公式,风别对应列表、字典、集合;推导公式的用法用中括号扩起来中间用for语句,后面跟着用if语句作为判断,满足条件的传到for语句前面用作构建列表。
a1 = [x for x in range(5)]
print("列表a1", a1)
odd = [x for x in range(5) if x % 2 != 0]
print("列表odd", odd)
d1 = {
n: n**2 for n in range(5)}
print("字典d1", d1)
d2 = {
v: k for k, v in d1.items()}
print("字典d2", d2)
s1 = {
i ** 2 for i in [-1, -2, 1, 3, -3

文章介绍了使用QTCreator和Python开发串口上位机的步骤,强调Python的数据处理优势。讨论了PyQT与Pyside2的选择,详细说明了Python基础、QT界面设计集成及串口助手通讯逻辑实现,涵盖异常处理与多线程概念。
QT Creator + Python&spm=1001.2101.3001.5002&articleId=128425211&d=1&t=3&u=882aec7fb96548b9965224f7f0e4320c)
6529

被折叠的 条评论
为什么被折叠?



