嵌入Python-Homework2

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()

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值