当前位置: 首页 > news >正文

Python+Tkinter 图形化界面基础篇:多线程和异步编程

Python+Tkinter 图形化界面基础篇:多线程和异步编程

  • 引言
  • 为什么需要多线程和异步编程?
  • 使用多线程
    • 多线程示例
      • 步骤 1 :导入必要的模块
      • 步骤 2 :创建主窗口和按钮
      • 步骤 3 :创建下载线程
      • 步骤 4 :启动主事件循环
  • 使用异步编程
    • 异步编程示例
      • 步骤 1 :导入必要的模块
      • 步骤 2 :创建主窗口和按钮
      • 步骤 3 :启动主事件循环
  • 总结

引言

在图形化界面应用程序中,响应性和流畅性是至关重要的。用户希望应用程序能够快速响应他们的操作,而不会出现卡顿或无响应的情况。为了实现这一目标,我们可以使用多线程和异步编程技术。本篇博客将重点介绍如何在 Python 图形化界面应用程序中使用多线程和异步编程来提高性能和响应性。

为什么需要多线程和异步编程?

在图形化界面应用程序中,主线程通常用于处理用户界面交互和事件处理。如果在主线程中执行耗时的操作(如网络请求、文件读写、计算等),会导致应用程序的界面被阻塞,用户体验不佳。为了解决这个问题,我们可以使用多线程或异步编程来将这些耗时的任务移到后台线程,从而保持主线程的响应性。

  • 多线程: 多线程是一种并发编程技术,允许应用程序同时执行多个线程。每个线程可以独立运行,执行不同的任务。这意味着可以将耗时的任务放在一个单独的线程中,以确保主线程保持响应性。

  • 异步编程: 异步编程是一种通过使用异步函数、协程和事件循环来处理非阻塞操作的方式。它使应用程序能够在等待 I/O 操作完成时继续执行其他任务,而不会阻塞主线程。

使用多线程

多线程示例

让我们首先看一个使用多线程的示例。假设我们有一个图形化界面应用程序,其中有一个按钮,点击按钮后需要执行一个耗时的任务,例如模拟下载文件。如果我们在主线程中执行下载操作,应用程序将在下载过程中无响应。为了避免这种情况,我们可以使用多线程执行下载任务,同时保持主线程的响应性。

步骤 1 :导入必要的模块

首先,导入 Tkinterthreading 模块:

import tkinter as tk
import threading

步骤 2 :创建主窗口和按钮

创建一个主 Tkinter 窗口,并添加一个按钮用于触发下载操作:

def download():# 模拟下载任务,这里可以替换为实际的下载操作for i in range(1, 6):result_label.config(text=f"下载中... ({i}/5)")root.update()  # 更新主界面以显示下载进度time.sleep(1)  # 模拟下载延迟result_label.config(text="下载完成")root = tk.Tk()
root.title("多线程示例")download_button = tk.Button(root, text="开始下载", command=download)
download_button.pack()result_label = tk.Label(root, text="")
result_label.pack()

步骤 3 :创建下载线程

创建一个下载线程,用于执行下载任务:

download_thread = Nonedef start_download_thread():global download_threadif download_thread is None or not download_thread.is_alive():download_thread = threading.Thread(target=download)download_thread.start()

步骤 4 :启动主事件循环

最后,启动 Tkinter 的主事件循环以显示主窗口和按钮,并在按钮点击时触发下载线程:

download_button = tk.Button(root, text="开始下载", command=start_download_thread)
download_button.pack()root.mainloop()

效果图:
在这里插入图片描述

现在,当你点击“开始下载”按钮时,下载将在一个单独的线程中执行,而不会阻塞主线程,从而保持应用程序的响应性。

使用异步编程

异步编程示例

现在让我们看一个使用异步编程的示例。假设我们有一个图形化界面应用程序,其中有一个按钮,点击按钮后需要执行一个异步操作,例如发起 HTTP 请求并等待响应。如果我们在主线程中执行这个操作,应用程序将在等待响应时无响应。为了避免这种情况,我们可以使用异步编程来处理这个任务,同时保持主线程的响应性。

步骤 1 :导入必要的模块

首先,导入 Tkinterasyncio 模块:

import tkinter as tk
import asyncio

步骤 2 :创建主窗口和按钮

创建一个主 Tkinter 窗口,并添加一个按钮用于触发异步操作:

async def fetch_data():# 模拟异步操作,这里可以替换为实际的异步任务for i in range(1, 6):result_label.config(text=f"请求中... ({i}/5)")root.update()  # 更新主界面以显示进度await asyncio.sleep(1)  # 模拟异步操作延迟result_label.config(text="请求完成")root = tk.Tk()
root.title("异步编程示例")fetch_button = tk.Button(root, text="发起请求", command=lambda: asyncio.create_task(fetch_data()))
fetch_button.pack()result_label = tk.Label(root, text="")
result_label.pack()

步骤 3 :启动主事件循环

最后,启动 Tkinter 的主事件循环以显示主窗口和按钮,并在按钮点击时触发异步操作:

fetch_button = tk.Button(root, text="发起请求", command=lambda: asyncio.create_task(fetch_data()))
fetch_button.pack()root.mainloop()

效果图:
在这里插入图片描述

现在,当你点击“发起请求”按钮时,异步操作将在后台执行,而不会阻塞主线程,从而保持应用程序的响应性。

总结

在本博客中,我们介绍了如何使用多线程和异步编程来提高 Python 图形化界面应用程序的性能和响应性。多线程可用于将耗时任务移到后台线程,而异步编程可用于处理非阻塞操作。根据你的应用程序需求,你可以选择使用其中一种或两种技术来改进你的应用程序。请记住,在多线程和异步编程中,要确保正确处理线程安全和错误处理,以确保应用程序的稳定性和可靠性。希望这个博客对你有所帮助,使你能够更好地利用多线程和异步编程来开发图形化界面应用程序。

相关文章:

Python+Tkinter 图形化界面基础篇:多线程和异步编程

PythonTkinter 图形化界面基础篇:多线程和异步编程 引言为什么需要多线程和异步编程?使用多线程多线程示例步骤 1 :导入必要的模块步骤 2 :创建主窗口和按钮步骤 3 :创建下载线程步骤 4 :启动主事件循环 使…...

第13章 并发编程高阶(二)

13.11 Reentrantlock和Synchronized有哪些区别 难度:★★ 重点:★★ 白话解析 继续串线,搞明白了锁的设计,那Java设计的Reentrantlock锁和JVM底层的synchronized锁到底有什么区别呢。 参考答案 1、底层实现层面 synchronized 是JVM层面的锁,是Java关键字 reentrantlock…...

Android AMS——栈管理详解(十一)

上一篇我们找到了栈管理所在的方法,这里继续对内部方法进行详细分析。 setInitialState:初始化函数。 computeLaunchingTaskFlags:检查 Activity 的启动模式。 computeSourceRootTask:处理源 Activity 的所在栈。 getReusableTask:获取能够复用的 Task。 computeTargetTas…...

【Redis】Set集合相关的命令

目录 命令SADDSMEMBERSSISMEMBERSCARDSPOPSMOVESREMSINTERSINTERSTORESUNIONSUNIONSTORESDIFFSDIFFSTORE 命令 SADD 将⼀个或者多个元素添加到set中。注意,重复的元素⽆法添加到set中。 SADD key member [member ...]SMEMBERS 获取⼀个set中的所有元素&#xff0…...

力扣第501题 二叉树的众数 c++ (暴力 加 双指针优化)

题目 501. 二叉搜索树中的众数 简单 相关标签 树 深度优先搜索 二叉搜索树 二叉树 给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。 …...

MARKDOWN 文档图片编码嵌入方案

#1 写在前面 开始写这篇文章时,标题怎么定困扰我良久,缘于不晓得如何给接下来要做的事定个简单明了的标题:在📱终端只能纯文本交互的前提下,优雅展示 markdown 文档中的图片。这也许比问题本身还要棘手😄。…...

KubeVela可持续测试应用部署之Mock基础设施

Mock接口是我们常用的功能测试方案,有时候依赖的接口未开发完成或者依赖的第三方接口不提供测试环境等,只有Mock才能跑通流程。 我们基于KubeVela开发的云原生应用交付平台,提供如初始化基础设施导入、中间件部署共用基础设施等相关能力的测试,需要依赖基础设施。虽然terr…...

代理IP、Socks5代理与网络工程:解析技术世界的无限可能

在当今数字化的世界中,网络工程师不仅需要保证网络的稳定性,还要应对多样的技术挑战。代理IP和Socks5代理技术已经成为网络工程师工具箱中不可或缺的利器,在跨界电商、爬虫、出海、网络安全、游戏等领域发挥关键作用。本文将深入探讨这两项技…...

OpenCV级联分类器识别车辆实践笔记

1. OpenCV 级联分类器的基本原理 基于Haar特征的级联分类器的目标检测是Paul Viola和Michael Jones在2001年的论文中提出的一种有效的目标检测方法。这是一种基于机器学习的方法,从大量的正面和负面图像中训练级联函数。然后用它来检测其他图像中的物体。 Haar特征…...

VS编译的时候不生成Release文件夹

方法描述: Build>Configuration Manager>Release 编译》配置管理》选择发布版本 再编译就有了 具体操作过程 第一步: 第二步: 第三步: 特此记录 anlog 2023年10月12日...

14.2 Socket 反向远程命令行

在本节,我们将继续深入探讨套接字通信技术,并介绍一种常见的用法,实现反向远程命令执行功能。对于安全从业者而言,经常需要在远程主机上执行命令并获取执行结果。本节将介绍如何利用 _popen() 函数来启动命令行进程,并…...

PCL点云处理之点云重建为Mesh模型并保存到PLY文件 ---方法二 (二百一十一)

PCL点云处理之点云重建为Mesh模型并保存到PLY文件 ---方法二 (二百一十一) 一、算法介绍二、算法实现1.代码2.效果一、算法介绍 离散点云重建为mesh网格模型,并保存到PLY文件中,用于其他软件打开查看,代码非常简短,复制粘贴即可迅速上手使用,具体参数根据自己的点云数据…...

CSS 中::after的妙用(实现在margin中显示内容)

效果图如下: 背景: 如上图,之前只是当纯的写一个参考货架平面图,用作物料系统的在库状态可视化,当完成页面body分成10等份时,货架之间需要有通道,为了实现实际的样式,我给每个等份都…...

SentenceTransformer使用多GPU加速向量化

文章目录 前言代码 前言 当我们需要对大规模的数据向量化以存到向量数据库中时,且服务器上有多个GPU可以支配,我们希望同时利用所有的GPU来并行这一过程,加速向量化。 代码 就几行代码,不废话了 from sentence_transformers i…...

架构师-软件工程习题选择题

架构师-软件工程习题选择题 真题案例题 真题 c 瀑布模型:针对软件需求明确的情况,将前一个阶段做完,才能开始下一个阶段 原型模型:针对需求不明确的情况,快速搭建出系统原型,然后根据系统原型和客户确认需求…...

springboot单独在指定地方输出sql

一般线上项目都是将日志进行关闭,因为mybatis日志打印,时间长了,会占用大量的内存,如果我想在我指定的地方进行打印sql情况,怎么玩呢! 下面这个场景: 某天线上的项目出bug了,日志打印…...

gpio内部结构(一)

一,GPIO内部结构 1,保护二极管 * 引脚内部加上这两个保护二级管可以防止引脚外部过高或过低的电压输入。 * 当引脚电压高于 VDD_FT 或 VDD 时,上方的二极管导通吸收这个高电压。 * 当引脚电压低于 VSS 时,下方的二极管导通&…...

【C++14保姆级教程】变量模板,Labmda泛型

文章目录 前言一、变量模板(Variable Templates)1.1 变量模板是什么1.2 泛型大概使用1.3 示例代码11.4 示例代码21.5 示例代码3 二、Lambda泛型(Lambda Generics)2.1 Lambda表达式泛型是什么?2.2 函数原型怎么写&#…...

LLM - 旋转位置编码 RoPE 代码详解

目录 一.引言 二.RoPE 理论 1.RoPE 矩阵形式 2.RoPE 图例形式 3.RoPE 实践分析 三.RoPE 代码分析 1.源码获取 2.源码分析 3.rotary_emb 3.1 __init__ 3.2 forward 4.apply_rotary_pos_emb 4.1 rotate_half 4.2 apply_rotary_pos_emb 四.RoPE 代码实现 1.Q/K/V …...

Vue之VueX知识探索(一起了解关于VueX的新世界)

目录 前言 一、VueX简介 1. 什么是VueX 2. VueX的作用及重要性 3. VueX的应用场景 二、VueX的使用准备工作 1. 下载安装VueX 2. vuex获取值以及改变值 2.1 创建所需示例 2.2 将创建好的.vue文件页面显示 2.3 创建VueX的相关文件 2.4 配置VueX四个js文件 2.5 加载到vue示…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

Tauri2学习笔记

教程地址&#xff1a;https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引&#xff1a;https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多&#xff0c;我按照Tauri1的教程来学习&…...

多模态大语言模型arxiv论文略读(112)

Assessing Modality Bias in Video Question Answering Benchmarks with Multimodal Large Language Models ➡️ 论文标题&#xff1a;Assessing Modality Bias in Video Question Answering Benchmarks with Multimodal Large Language Models ➡️ 论文作者&#xff1a;Jea…...