程序示意图

前言

为实现二维码传输文件,首先要在电脑屏幕上动态展示已经之前已拆分好的二维码,然后使用摄像头对着电脑屏幕按帧读取,最后还原出原来的文件。

本章使用Python自带的GUI库tkinter实现在电脑屏幕上动态展示已经之前已拆分好的二维码。


目录

一、制作基于tkinter的静态图片显示窗口

二、读取已拆分的二维码,使用tkinter窗口循环显示

三、运行效果和完整代码


一、制作基于tkinter的静态图片显示窗口

首先是使用tkinter库的Tk组件,创建tkinter窗口对象root,并对窗口对象root的标题进行设置。代码如下:

from tkinter import Tk
# 创建窗口
root = Tk()
# 设置窗口的标题
root.title("利用二维码发送文件工具")

然后使用pillow(PIL)Image组件,读取需要显示的图片。代码如下:

from PIL import Image# 创建图片组件
_pil_image = Image.open('cache/split_file_000.png')

最后是把图片显示在窗口中,由于事先不知道图片长宽,同时窗口可显示大小有限,太大的图片只能一部分,所以这里需要对图片进行缩放,以适应窗口大小。缩放图片的函数代码如下,函数会返回一个缩放好的图像对象。

# 缩放图片的函数,w是原来图片的宽,h是原来图片的高,w_box是想缩放的宽,h_box是想缩放的高
# pil_image是原图片对象,函数会返回一个缩放好的图像对象
def resize(w, h, w_box, h_box, pil_image):f1 = 1.0 * w_box / wf2 = 1.0 * h_box / hfactor = min([f1, f2])width = int(w * factor)height = int(h * factor)return pil_image.resize((width, height), Image.Resampling.LANCZOS)

有了缩放函数后,就可把任意大小的图片显示在tkinter窗口了。这里使用tkinterLabel组件加载图片,Label组件通过.grid(x,y)网格布局模式加入窗口对象root中。

需要注意的是PILImage对象不能直接显示在tkinter窗口上,需要先把Image对象转换成ImageTk对象,完整的代码如下:

from tkinter import Tk
from tkinter import Label
from PIL import Image, ImageTkdef open_window():# 创建窗口root = Tk()# 设置窗口的标题root.title("利用二维码发送文件工具")# 创建图片组件_pil_image = Image.open('cache/split_file_000.png')# 缩放图片_w, _h = _pil_image.size_pil_image_resized = resize(_w, _h, 300, 300, _pil_image)_tk_image = ImageTk.PhotoImage(_pil_image_resized)# 创建图片组件,放置在root中_label_dt = Label(root, image=_tk_image, width=300, height=300)_label_dt.grid(row=0, column=0)root.mainloop()# 缩放图片的函数,w是原来图片的宽,h是原来图片的高,w_box是想缩放的宽,h_box是想缩放的高
# pil_image是原图片对象,函数会返回一个缩放好的图像对象
def resize(w, h, w_box, h_box, pil_image):f1 = 1.0 * w_box / wf2 = 1.0 * h_box / hfactor = min([f1, f2])width = int(w * factor)height = int(h * factor)return pil_image.resize((width, height), Image.Resampling.LANCZOS)

运行效果如下:

二、读取已拆分的二维码,使用tkinter窗口循环显示

刚才已完成静态二维码图片的显示,现需要将拆分的二维码动态进行显示,这里读取上一篇文章拆分好的29张图片,实现按文件名顺序,每隔0.2S显示一张不同的二维码图片。

首先,编制更新tkinter窗口中Label组件_label_dt图像的函数,若要更新_label_dt中的图片只需使用_label_dt.configure(image=_tk_image)即可,其中_tk_image通过使用按顺序的文件名读取新的二维码图片,_pil_image = Image.open("cache/split_file_00" + str(i) + ".png"),这里通过str(i)循环文件名,并通过函数传入的_time_interval参数控制循环时的时间间隔,同时_label_dt要换成global全局变量,以便分线程可以操作主线程创建的_label_dt组件主要代码如下:

# 循环更新tkinter窗口中,二维码图片的函数,_time_interval为更新频率,
def update_qr(_time_interval):for i in range(0, len(os.listdir("cache"))):time.sleep(_time_interval)# 读取二维码图片_image_filepath = "cache/split_file_00" + str(i) + ".png"_pil_image = Image.open(_image_filepath)print(_image_filepath)# 缩放图片_w, _h = _pil_image.size_pil_image_resized = resize(_w, _h, 300, 300, _pil_image)_tk_image = ImageTk.PhotoImage(_pil_image_resized)global _label_dt_label_dt.configure(image=_tk_image)_label_dt.image = _tk_image

有了二维码图片的更新函数后,还有一个问题需要解决,就是更新操作不能阻塞tkinter的窗口主线程,否则当更新图片的时候窗口会被阻塞不能同时进行其他操作,因此这里需要为更新二维码图片update_qr()函数启动单独的线程。

开启线程需要用到Python的threading包,这里需要特别注意的是当.Thread()中的args=(,)只有一个参数时必须要有,逗号结尾,因为它接受的是列表类型的参数,主要代码如下:

# 用于更新图片的线程
def update_qr_thread(_time_interval):# 设置更新频率为_time_interval秒# 设置线程参数,target为线程启动函数,name为线程名,args为传递给线程函数的参数_t = threading.Thread(target=update_qr, name='update_qr', args=(_time_interval,))# 启动线程_t.start()

所有准备工作都完成了,现在只需要在创建窗口时调用线程便可,这里使用root.after(3,update_qr_thread(0.2))函数,在创建窗口后3秒才启动线程以免一些窗口初始化工作未完成就启动线程,造成不必要错误。

# 窗口显示后3秒执行update_qr_thread()函数
root.after(3, update_qr_thread(0.2))
# 显示窗口
root.mainloop()

三、运行效果和完整代码

全部代码码完,运行看到以下效果:

完整代码如下:

import os
import time
from tkinter import Tk
from tkinter import Label
from PIL import Image, ImageTk
import threading# 图片组件
_label_dt = Nonedef open_window():# 创建窗口root = Tk()# 设置窗口的标题root.title("利用二维码发送文件工具")# 创建图片组件_pil_image = Image.open('cache/split_file_000.png')# 缩放图片_w, _h = _pil_image.size_pil_image_resized = resize(_w, _h, 300, 300, _pil_image)_tk_image = ImageTk.PhotoImage(_pil_image_resized)# 创建图片组件,放置在root中global _label_dt_label_dt = Label(root, image=_tk_image, width=300, height=300)_label_dt.grid(row=0, column=0)# 窗口显示后3秒执行update_qr_thread()函数root.after(3, update_qr_thread(0.2))# 显示窗口root.mainloop()# 缩放图片的函数,w是原来图片的宽,h是原来图片的高,w_box是想缩放的宽,h_box是想缩放的高
# pil_image是原图片对象,函数会返回一个缩放好的图像对象
def resize(w, h, w_box, h_box, pil_image):f1 = 1.0 * w_box / wf2 = 1.0 * h_box / hfactor = min([f1, f2])width = int(w * factor)height = int(h * factor)return pil_image.resize((width, height), Image.Resampling.LANCZOS)# 用于更新图片的线程
def update_qr_thread(_time_interval):# 设置更新频率为_time_interval秒# 设置线程参数,target为线程启动函数,name为线程名,args为传递给线程函数的参数_t = threading.Thread(target=update_qr, name='update_qr', args=(_time_interval,))# 启动线程_t.start()# 循环更新tkinter窗口中,二维码图片的函数,_time_interval为更新频率,
def update_qr(_time_interval):for i in range(0, len(os.listdir("cache"))):time.sleep(_time_interval)# 读取二维码图片_image_filepath = "cache/split_file_00" + str(i) + ".png"_pil_image = Image.open(_image_filepath)print(_image_filepath)# 缩放图片_w, _h = _pil_image.size_pil_image_resized = resize(_w, _h, 300, 300, _pil_image)_tk_image = ImageTk.PhotoImage(_pil_image_resized)global _label_dt_label_dt.configure(image=_tk_image)_label_dt.image = _tk_imageif __name__ == '__main__':open_window()

【Python-利用动态二维码传输文件(三)】动态二维码展示界面制作,涉及PIL库、threading库、os库、time库和tkinter库的Tk、Label组件相关推荐

  1. 【Python-利用动态二维码传输文件(四)】使用pyautogui库录屏(连续截图),然后利用OpenCV逐张读取截图,识别当中的二维码信息,并把信息重组成原文件

    程序示意图 目录 一.使用pyautogui库,对电脑屏幕进行录屏 二.使用OpenCV库对100帧截图进行识别,并与原29帧二维码图片内含信息进行比对 三.把获取的100帧二维码信息去重,并保持原来 ...

  2. 利用sshpass避免scp命令传输文件多次输入密码

    利用sshpass避免scp命令传输文件多次输入密码 1.scp基本用法: scp是基于ssh的 将本地文件上传或发送到服务器的命令. scp localpath username@ip:server ...

  3. 【收藏】Python利用Excel+模板批量生成word文件

    Python利用Excel+模板批量生成word文件 最近帮朋友批量生成小区业主物业费未缴的律师函.朋友那有物业那边的表格数据,包括楼栋-房间号.业主姓名.欠费日期.欠款金额等信息.目的是需要将这些表 ...

  4. python中label有什么用_对Python中TKinter模块中的Label组件实例详解

    Python2.7.4 OS-W7x86 1. 简介 Label用于在指定的窗口中显示文本和图像.最终呈现出的Label是由背景和前景叠加构成的内容. Label组件定义函数:Label(master ...

  5. linux两台电脑网线传文件,两台电脑如何利用网线直连高速传输文件?

    我们总有需要把一台电脑的资料传输到另一台电脑的时候,其实我们可以让两台电脑共享局域网,通过网线直连来达到传输的目的,下面来看看是怎么操作的吧. 1.设置电脑IP,首先打开下图界面,点击本地连接. 2. ...

  6. QtCreator源码分析(三)——QtCreator源码结构分析

    一.QtCreator源码目录简介 QtCreator-2.8.1包含5000多个文件,代码行数超过了110万行. 源码目录如下: bin: 生成Linux平台shell脚本. dist: 安装文件配 ...

  7. 怎么把多个文件做成一个二维码?文件怎么做成二维码?

    对于很多单位来说,现在经常会使用二维码的形式来传递文件给别人,有效的节省空间而且使用方便,那么多个文件怎么放到一个二维码展示呢?下面就让小编来给大家分享一下多文件生成二维码的操作方法吧,使用在线二维码 ...

  8. python 利用Crypto进行AES解密加密文件

     前言:今天写一个程序的时候: 加密模式:AES/CBC/PKCS5Padding 加密初始化向量:长度为 16 的空字节数组 一直搞不懂长度为16的空字节数组怎么表示 然后我用ECB模式发现跟他给的 ...

  9. Python网络编程——使用TCP方式传输文件

    TCP文件下载器 客户端 需求:输入要下载的文件名,从服务器端将文件拷贝到本地 步骤: 1.创建TCP套接字,绑定端口 2.连接服务端 3.输入要下载的文件名 4.将文件名编码,并发送到服务端 5.接 ...

  10. Python 实现txt、excel、csv文件读写【附源码】

    目录 前言 一.txt文件读写 二.excel文件读写 总结 前言 本文介绍使用Python进行文件读写操作,包括txt文件.excel文件(xlsx.xls.csv) 编译器使用的是PyCharm ...

最新文章

  1. 2020总结--惟愿人间花满天
  2. scala与python混合调用实验
  3. joblib自定义类的使用细节
  4. oracle的em能干什么,转载 解决Oracle的EM登录
  5. redis使用@Cacheable等注解为接口添加缓存
  6. 从实操教学到赛题演练,腾讯专家亲授TI-ONE平台操作攻略!
  7. 游戏开发所需要看的书
  8. Python Web 编程
  9. 如果判断小米MIUI的NFC权限、后台弹出界面权限是否禁用
  10. CNN with Attention---channal and spatial attention
  11. dax和m的区别_DAX:一文透彻理解DAX本质
  12. Docker Compose方式安装GitLab
  13. 禅与摩托车维修艺术(4)
  14. 【Maya】移动、缩放、旋转、万向节旋转、冻结(未完成)
  15. 虚拟机安装之用户在命令行上发出了EULAS AGREED=1,表示不接受许可协议(虚拟机卸载残留)
  16. Java 之父高斯林加入亚马逊 AWS
  17. 国内Android应用推广的六大主流方式
  18. python treeview控件使用详解,python Treeview使用笔记 1
  19. 计算机怎么恢复初始设定模式,将电脑恢复出厂设置的4种方法,简单易操作,值得收藏...
  20. 一份MES系统整体解决方案

热门文章

  1. Photoshop教程:10秒闪电搞定照片构图
  2. 通过精读一本英文技术书籍搞定英语
  3. QT 自定义圆形QLabel 加载圆形图片
  4. TFN系列超声波探伤仪为什么在众多品牌竞争中脱颖而出
  5. MQ系列SpringBoot快速整合RabbitMQ
  6. 云效研发效能度量体系,如何展示和解读交付效能数据
  7. 如何在Mozilla Firefox中启用(或禁用)Cookie
  8. 怎么用Python爬取抖音小视频? 资深程序员都这样爬取的(附源码)
  9. 万元怎样保留小数点_excel中数值转换成万元后如何只保留两位小数?,excle 万元 元...
  10. 第61篇:合并多个工作薄的所有工作表