Test28
import os
# 工作区:py程序执行的位置
print("hello")
# 工作区在哪
p = os.getcwd() # 获取工作区的位置
print("当前工作区: ", p)
print(__file__) # 本py文件绝对路径
print(os.path.dirname(__file__)) # 本py文件所在文件夹
p = os.path.dirname(__file__)
# 修改工作区 目的:保持工作区位置与执行的py文件所在文件夹一致
os.chdir(p) # 修改工作区位置
print("修改后的工作区: ", os.getcwd())
file = open("super.txt", "r") # 工作区中找该文件
# 总结通用写法,在主函数前使用以下代码
p =os.path.dirname(__file__)
os.chdir(p)
Test28,另一个py代码
# 图片处理模块 pillow
# 安装 pip install pillow
import PIL
import os
import PIL.Image
# 调整工作区(文件处理)
p =os.path.dirname(__file__)
os.chdir(p)
# 获取图片的镜像
img1 = PIL.Image.open("lena.jpg")
# 展示图片(通过备份)
img1.show() # 不在本程序中展示,而是通过系统默认图片浏览器打开
#尺寸
# print("size 宽高", img1.size)
# width,height = img1.size
s = img1.size
width = s[0]
height = s[1]
print("size 宽高",width,height)
#图片信息
print("图片信息: ",img1.info)
#图片模式
print("图片模式: ",img1.mode)
img2 = PIL.Image.open("_three.jpg")
print("three图片模式: ",img2.mode)
"""
模式总类:
1 - 1位像素图片
L - 8位像素图片, 灰度图(颜色只有黑白和过渡的灰 0表示黑 1表示白)
RGB - 24位像素彩色图片, 三个字节分别表示三种颜色的调制
RGBA - 32位像素彩色图片, 除了三原色外, 加一个Alpha透明度, 0表示完全透明, 255表示不透明
"""
# 创建图片
img3 = PIL.Image.new(mode="RGB",size=(60,80),color="#EF8AE1") # 创建了一张临时备份图片
img3.show()
img4 = PIL.Image.new(mode="RGBA",size=(60,80),color="#EF8AE1cc") # RGBA图片
img4.show()
#保存图片
img3.save("abc2207.png")
img4.save("helloAlpha.png")
img5 = PIL.Image.open("_three.jpg")
pixel_data = img5.load() # 获取了three图片的像素矩阵
s = img5.size
width = s[0]
height = s[1]
for y in range(height):
for x in range(width):
print(pixel_data[x, y], end= " ")
print()
print("end")
Test25
# 单选框
import tkinter
win = tkinter.Tk()
win.geometry("450x450")
rb_v = tkinter.IntVar() # 两个单选绑定同一个变量容器
rb1 = tkinter.Radiobutton(win)
rb1.configure(text= "一年级")
rb1.configure(variable= rb_v) # 绑定同一个变量容器
rb1.configure(value= 8) # 给每一个单选设置一个变量容器值
rb1.pack()
rb2_v = tkinter.IntVar()
rb2 = tkinter.Radiobutton(win)
rb2.configure(text= "二年级")
rb2.configure(variable= rb_v) # 绑定同一个变量容器
rb2.configure(value= 12) # 给每一个单选设置一个变量容器值
rb2.pack()
# 程序设计选中某一项
# rb2.select() # 通过控件对象进行设置
rb_v.set(12) # 通过变量容器设置对应值来实现选中
bt1 = tkinter.Button(win)
def op1(x):
re = rb_v.get()
if re == 8:
print("选中一年级")
elif re == 12:
print("选中二年级")
bt1.configure(text= "单选结果")
bt1.bind("<Button-1>", op1)
bt1.pack()
# 文本框
en1 = tkinter.Entry(win)
en1_v = tkinter.StringVar() # 字符串变量容器
en1.configure(width= 20) # 只能设置宽度,单行文本,高度被限制
en1.configure(font= ("宋体", 18))
en1.configure(textvariable= en1_v) # 把输入框的输入内容于字符串变量容器进行绑定
en1.pack()
en1_v.set("new2207")
bt2 = tkinter.Button(win)
def op2(x):
re = en1_v.get()
print(re)
bt2.configure(text= "打印输入内容")
bt2.bind("<Button-1>", op2)
bt2.pack()
win.mainloop()
Test27
# 多行文本
import tkinter
win = tkinter.Tk()
win.geometry("550x400")
tt = tkinter.Text(win)
tt.configure(width= 50, height= 5, bg= "#c4c3e6", font= ("宋体", 16))
tt.pack()
# 内容的插入 index定位格式"行,字符设置"
tt.insert("1.0", "welcome \n") # 在第一行的第0个字符前插入内容
tt.insert("1.0", "happy \n")
tt.insert("2.8", "good \n")
tt.insert("2.end", "ppt \n") # 在第二行的最后添加ppt
bt1 = tkinter.Button(win, text= "添加内容")
def op1(x):
global tt
tt.insert("insert", "strong")
bt1.bind("<Button-1>", op1)
bt1.pack()
# 删除内容
bt2 = tkinter.Button(win, text= "删除内容")
def op2(x):
global tt
tt.delete("1.0", "2.3") # 删除第一行的第1个字符到第二行第3个字符的内容
# tt.delete("1.0", "3.end") # 删除1-3行
bt2.bind("<Button-1>", op2)
bt2.pack()
# 获取内容
bt3 = tkinter.Button(win, text= "获取内容")
def op3(x):
global tt
re = tt.get("1.0", "end") # 获取第一行的第1个字符到最后的所有内容
print(re)
bt3.bind("<Button-1>", op3)
bt3.pack()
# 下拉菜单 ComboBox
import tkinter.ttk
cm = tkinter.ttk.Combobox(win)
va = ["com1", "com2", "com3"]
cm.configure(values= va) # 把列表中的内容赋值给values 作为选项内容
cm.current(0) # 设置当前默认选项
def op4(x):
global cm, va
va.append("com4") # 添加选项
cm.configure(values= va)
# print("sss")
cm.bind("<Button-1>", op4)
cm.pack()
def op5(x):
global re, la
re = cm.get()
la.configure(text= re)
print("sss")
cm.bind("<<ComboxSelected>>", op5)
cm.pack()
# 获取当前选项
bt6 = tkinter.Button(win, text= "获取当前选项")
def op6(x):
global cm
re = cm.get() # 获取第一行的第1个字符到最后的所有内容
print(re)
bt6.bind("<Button-1>", op6)
bt6.pack()
la = tkinter.Label(win)
la.configure(text= "xxxx", font= ("宋体", 16))
la.pack()
# 按钮选项 SpinBox
sp1 = tkinter.Spinbox(win)
sp1.configure(font= ("宋体", 18))
sp1.configure(from_= 8, to= 12)
sp1.pack()
sp2 = tkinter.Spinbox(win)
va4 = ["星期一", "星期二", "星期三"]
sp2.configure(font= ("宋体", 18))
sp2.configure(values= va4)
sp2.pack()
bt7 = tkinter.Button(win, text= "获取当前选项")
def op7(x):
global sp2
re = sp2.get() # 获取第一行的第1个字符到最后的所有内容
print(re)
bt7.bind("<Button-1>", op7)
bt7.pack()
win.mainloop()
Test24
# 对话框
import tkinter
import tkinter.messagebox
win = tkinter.Tk()
win.geometry("300x300")
# 消息对话框
bt1 = tkinter.Button(win)
bt1.configure(text= "消息对话框")
def op1(x):
re = tkinter.messagebox.showinfo(title= "消息标题 good", message= "消息内容 book")
print("hello: ", re)
bt1.bind("<Button-1>", op1)
bt1.pack(side= "top", anchor= "e")
# 错误对话框
bt2 = tkinter.Button(win)
bt2.configure(text= "错误消息框")
def op2(x):
re = tkinter.messagebox.showerror(title= "错误提示 error", message= "错误内容 bad")
print("happy: ", re)
bt2.bind("<Button-1>", op2)
bt2.pack(side= "top", anchor= "e")
# 疑问对话框
bt3 = tkinter.Button(win)
bt3.configure(text= "Yes/No对话框")
def op3(x):
re = tkinter.messagebox.askyesno(title= "是否疑问 error", message= "是否健康")
if re == True:
print("是, 好好生活")
else:
print("否, 按时看医生")
bt3.bind("<Button-1>", op3)
bt3.pack(side= "top", anchor= "center")
# 三选对话框
bt4 = tkinter.Button(win)
bt4.configure(text= "三选对话框")
def op4(x):
re = tkinter.messagebox.askyesnocancel(title= "投票", message= "提前下课")
if re == True:
print("赞成")
elif re == False:
print("反对")
elif re == None:
print("弃权")
bt4.bind("<Button-1>", op4)
bt4.pack(side= "top", anchor= "center")
# 复杂对话框
# 文本输入对话框
import tkinter.simpledialog
bt5 = tkinter.Button(win)
bt5.configure(text= "文本输入")
def op5(x):
re = tkinter.simpledialog.askstring(title= "晚饭", prompt= "晚饭想吃什么呢: ")
print(re)
bt5.bind("<Button-1>", op5)
bt5.pack(side= "top", anchor= "w")
# 文本浏览对话框
import tkinter.filedialog
la = None
bt6 = tkinter.Button(win)
bt6.configure(text= "文本浏览")
def op6(x):
global la
re = tkinter.filedialog.askopenfilename()
la.configure(text= re)
bt6.bind("<Button-1>", op6)
bt6.pack(side= "top", anchor= "w")
la = tkinter.Label(win)
la.configure(width= 80, relief= "solid")
la.pack(side= "top", anchor= "w")
# 复选框
la = tkinter.Label(win)
la.configure(text= "喜欢的运动")
la.pack(side= "top", anchor= "w")
"""
了解checkbutton是否选中
1定义变量容器 2checkbutton与变量容器关联 3读取变量容器, 获知是否选中
"""
ch1_v = tkinter.IntVar() # 变量容器定义
ch1 = tkinter.Checkbutton(win)
ch1.configure(text= "篮球")
ch1.configure(variable= ch1_v) # 变量容器与控件关联
ch1.pack(side= "top", anchor= "w")
ch2_v = tkinter.IntVar() # 变量容器定义
ch2 = tkinter.Checkbutton(win)
ch2.configure(text= "游泳")
ch2.configure(variable= ch2_v) # 变量容器与控件关联
ch2.pack(side= "top", anchor= "w")
bt7 = tkinter.Button(win)
bt7.configure(text= "喜欢的运动")
def op7(x):
global ch1_v, ch2_v
st = "喜欢: "
print(ch1_v.get()) # 读取变量容器, 获知是否选中
if ch1_v.get() == 1:
st = st+"篮球"
if ch2_v.get() == 1:
st = st+"游泳"
print(st)
bt7.bind("<Button-1>", op7)
bt7.pack(side= "top", anchor= "w")
win.mainloop()
Test21
print("========== Tkinter窗口程序设计=========")
#安装:pip install tk
import tkinter as tk
import threading
import time
window = 0
#实现一个窗口管理线程
def window_op():
global window
a = 13
b = 2
c = 18
#获取当前窗口的长和高
while True:
print(window.winfo_width(),window.winfo_height())
st="010212"
st = "#%02x%02x%02x"%(a,b,c)
window.configure(bg=st)
c += 10
if c >= 255:
C = 0
time.sleep(0.4)
##################################################################
#主窗口建立
window = tk.Tk()
#设置菜单标顾
window.title("嵌入2208")
#隐藏菜单栏
# window.overrideredirect(True)
#没置窗口的大小
window.geometry("300x400+200+300") # 宽x高+左移+下移
#限制窗口最大和最小
window.maxsize(600,600)
window.minsize(100,100)
#固定窗口大小的办法:最大值=最小值
# window.maxsize(600,600)
# window.minsize(600,600)
#控件:窗口中可控可显示的元素。举例:Label文本框,Button按钮
#把控件纳入到窗口中
mt= tk.Label(window,text="今天吃炒饭")# 创建一个label对象,从属于window
mt.pack()
st = tk.Button(window,text="点我啊")
st.pack()
# 窗口的背景颜色
window.configure(bg="blue")
window.configure(bg="#D1FC34")
t1 =threading.Thread(target=window_op)
t1.start()
#运行主窗口,启动事件响应,它在主线程中阻塞
window.mainloop()
print("end")
Test19
# 应用
from test_19Ser import MyCom
import time
mc1 = MyCom()
mc1.set_serial(pt = "com3")
mc1.show_serial()
print(mc1.get_serial_com())
mc1.open_mycom()
mc1.send_mycom("happy")
mc1.start() # 启动 接收数据 线程
print("end")
# mc1.close_mycom()
Test19-2
# 串口
import serial
import serial.tools.list_ports
import threading
class MyCom(threading.Thread):
def __init__(self): # 设置属性
super.__init__() # 父类的初始化
self.ms = serial.Serial() # 创建串口对象
self.com_list = [] # 保存可用的串口号
def set_serial(self, pt = "com1", br = 9600, pa = serial.PARITY_NONE): # 设置串口属性
self.ms.port = pt
self.ms.baudrate = br
self.ms.parity = pa
def get_serial(self): # 打印信息
print("串口对象信息: ", self.ms.port, self.ms.baudrate, self.ms.parity)
def get_serial_com(self): # 返回可用的串口号
ports = serial.tools.list_ports.comports()
for i in ports:
self.com_list.append(i[0])
return self.com_list
def open_mycom(self): # 连接串口
if self.ms.is_open: # 如果对象已经连接串口,则需要先断开连接
self.ms.close()
print("关闭旧的连接")
else:
pass
try:
self.ms.open() # 连接串口
print("连接成功")
except Exception as e:
print("连接失败", e)
def close_mycom(self): # 断开连接
self.ms.close()
def send_mycom(self, st): # 发送数据,st为字符串
if self.ms.is_open:
tmp = str(st)
stb = bytes(tmp, encoding= "utf-8")
self.ms.write(stb)
# print("发送成功")
else:
print("发送错误: 还未连接")
def receive_mycom(self): # 只读一次,返回读取的内容
if self.ms.is_open:
re = self.ms.read_all()
return re
else:
print("接收错误: 还未连接")
return None
# 接收数据 线程:提供一个线程,打印并接收数据
# def run(self):
# while True: # 不断监听,打印
# if self.ms.is_open:
# g = self.receive_mycom()
# if len(g) != 0:
# print(g)
# else:
# pass
# else:
# print("串口未打开") # 结束循环
Test18
print("==========字节数组 bytes==========")
# 初衷,字节流操作
# 字节数组常亮
"abcd中文" # 字符串类型,每个字符 2 个字符
b"abcd" # bytes 类型(c语言中的字符串),每个字符 1 个字符,不能写中文
# 字节数组使用
a = bytes() # 空的字节数组
c = bytes("abcdf中文",encoding="utf-8") # 把str转为字节数组
print(c)
f = bytes([0x40,0x50,0x60]) # 把int列表转化为字节数组
print(f)
# 字节数组调用 看成列表数组操作f【i】
print( "%x"%(f[0]) )
print( "%x"%(f[1]) )
print( "%x"%(f[2]) )
print( len(f) ) # 查看字节数组的元素个数
# 字节数组遍历
for i in f:
print(i)
print("==========串口开发===========")
# 安装 pyserial 联网 指令: pip install pyserial
import serial # 串口操作库
import serial.tools.list_ports # 串口设备环境库
# 了解设备中的串口数量克名称
ports = serial.tools.list_ports.comports() # 返回设备中所有串口的描述
com_list = []
for i in ports:
com_list.append(i[0]) # 把所有串口名都放到com_list列表中
print(i[0])
# 创建串口实例
ser = serial.Serial() # 串口实例,未连接
ser.port = "com3" # 串口名
ser.baudrate = 115200 # 波特率
ser.parity = serial.PARITY_NONE # 校验
# 打开串口
if ser.is_open: # 串口实例已经打开过
pass
else:
ser.open()
# 数据发送
st = "Welcom to guangzhou"
stb = bytes(st,encoding="utf-8") # 把数组转为字节数组
ser.write(stb)
bt = [0xaa,0x90,0x25,0x18]
btb = bytes(bt)
ser.write(btb)
# 数据接收
while True:
re = ser.read_all() # re就是bytes,串口接收内容
if len(re) == 0:
pass
else:
print(re)
for i in re:
print( "%x"%(i) )
break
# 关闭串口
ser.close()