在tkinter中使用eventlet协程,并且进行界面动态刷新数据

tkinter动态表格 - 实时更新数据(TkinterTable) tkinter动态表格 - 实时更新数据(TkinterTable) 参考 [TkinterTable] Tkinter上的表格GUI】 https://github.com/dmnfarrell/tkintertable/wiki/Usage https://github.com/dmnfarrell/tkintertable/issues/47 python使用tkinter编写一个数据显示窗口(实时显示更新的数据) 首先安装TkinterTable,即pip install tki 阅读详情

eventle是极其方便的绿色线程(协程)库,协程比线程、进程要易用(主要是不必考虑什么同步、信号等因素),而且由于没有cpu和os的切换动作,协程响应速度更快。

tkinter是古老的gui库,python原生自带,由于一些所见即所得的gui工具,给它新的生命力。我比较喜欢的是pygubu-designer,最大的好处是工具轻巧、简单,不需要网络在线,不需要import其他的库,可以直接生成界面python代码,不影响自己的原有思路。

关于如何在tkinter的gui界面上刷新数据,网上已有一些探索,主要是使用root.after的定时器方法进行刷新,不免有些"粗俗、笨重”。

经过两天的研究,把tkinter的root.mainloop重新写成协程化,就可以愉快的使用eventlet了,而且动态刷新数据也可以使用协程操作。mainloop中的协程主循环,先完成tkinter本身的两个update,然后在把协程切换出去。

    def coroutine_mainloop(self, n=0):
        while True:
            self.mainwindow.update_idletasks()
            self.mainwindow.update()
            eventlet.sleep(n)

不过这样处理后,gui界面关闭时会出现奇怪的情况,若有其他协程没有关闭,gui界面关闭了,但是其他协程还在继续运行,tkinter的mainloop也会继续运转,必须用ctrl+c来退出程序。为此只好重新写一个close事件的处理,注册“WM_DELETE_WINDOW"的tkinter事件处理,绑定一个关闭处理过程,进行强制退出关闭。

    def on_closing(self):
        print ("on_closing")
        self.mainwindow.quit()        
        self.mainwindow.destroy()
        print ("self.mainwindow.destroy()")
        os._exit(0)

    def run_First(self):
        #self.hub = eventlet.hubs.get_hub()
        self.C1_running = False
        self.C2_running = False
        self.mainwindow.protocol("WM_DELETE_WINDOW", self.on_closing)

整个程序可以从下面复制,协程刷新数据的过程也很简单,启动一个新的协程,然后在新协程里对界面元素进行update。界面元素已经绑定了tk变量,直接set变量值,再对界面元素update,就能看到效果。

因为是协程的原因,所有代码都属于同一个主线程,都是公平的地位,对名字空间、变量的访问也是平等的,带来了清晰的思路和方便的操作。

这里设置一个self.C1_running变量,防止协程被重入。

    def C1(self, event=None):
        def C1_loop(self, Count):
            print ("C1 Run")
            while True:
                if Count <= 0:
                    break
                Count -= 1
                print (Count, end=" ", flush=True)
                eventlet.sleep(0.1)
                self.intBt1.set(Count)
                self.bt1.update()
            self.C1_running = False
            self.intBt1.set(100)
            self.bt1.update()
        if self.C1_running:
            return
        self.C1_running = True
        run_loop = eventlet.spawn(C1_loop, self, 100)

整个示例程序在这里,直接复制后,即可运行

# -*- coding: utf-8 -*-
from __future__ import absolute_import, print_function

# A example for use eventlet in tkinter to update gui data in real time
# programe by makefool@163.com
import eventlet
import os

#!/usr/bin/python3
import tkinter as tk
import tkinter.ttk as ttk
# Powered by pygubu-designer
# pygubu-designer
# pip install pygubu-designer

class GuiEventletApp:
    def __init__(self, master=None):
        # build ui
        self.toplevel1 = tk.Tk() if master is None else tk.Toplevel(master)
        self.toplevel1.configure(height=200, width=200)
        self.toplevel1.resizable(False, False)
        self.bt1 = ttk.Button(self.toplevel1)
        self.intBt1 = tk.IntVar(value=100)
        self.bt1.configure(text='100', textvariable=self.intBt1, width=30)
        self.bt1.pack(side="top")
        self.bt1.bind("<ButtonPress>", self.C1, add="")
        self.bt2 = ttk.Button(self.toplevel1)
        self.intBt2 = tk.IntVar(value=30)
        self.bt2.configure(text='30', textvariable=self.intBt2, width=30)
        self.bt2.pack(side="top")
        self.bt2.bind("<ButtonPress>", self.C2, add="")

        # Main widget
        self.mainwindow = self.toplevel1

    def run(self):
        self.mainwindow.mainloop()

    def C1(self, event=None):
        def C1_loop(self, Count):
            print ("C1 Run")
            while True:
                if Count <= 0:
                    break
                Count -= 1
                print (Count, end=" ", flush=True)
                eventlet.sleep(0.1)
                self.intBt1.set(Count)
                self.bt1.update()
            self.C1_running = False
            self.intBt1.set(100)
            self.bt1.update()
        if self.C1_running:
            return
        self.C1_running = True
        run_loop = eventlet.spawn(C1_loop, self, 100)

    def C2(self, event=None):
        def C2_loop(self, Count):
            while True:
                if Count <= 0:
                    break
                Count -= 1
                eventlet.sleep(0.1)
                self.intBt2.set(Count)
                self.bt2.update()
            self.C2_running = False
            self.intBt2.set(30)
            self.bt2.update()
        if self.C2_running:
            return
        self.C2_running = True
        run_loop = eventlet.spawn(C2_loop, self, 30)

    def on_closing(self):
        print ("on_closing")
        self.mainwindow.quit()        
        self.mainwindow.destroy()
        print ("self.mainwindow.destroy()")
        os._exit(0)

    def run_First(self):
        #self.hub = eventlet.hubs.get_hub()
        self.C1_running = False
        self.C2_running = False
        self.mainwindow.protocol("WM_DELETE_WINDOW", self.on_closing)

    def coroutine_mainloop(self, n=0):
        while True:
            self.mainwindow.update_idletasks()
            self.mainwindow.update()
            eventlet.sleep(n)

if __name__ == "__main__":
    app = GuiEventletApp()
    app.run_First()
    app.coroutine_mainloop()

Tkinter界面动态显示变化数值 例举字符串StringVar()和整型IntVar() var = tk.StringVar() 或 var = tk.IntVar() var.set() #设置 var.get() #获取 1.整型IntVaVar() #IntVar() 要配合控件便使用 import tkinter as tk from tkinter import * import time if __name__=="__main__": top=tk.Tk() top.wm_title("face rec 阅读详情

相关推荐

python tkinter 实时刷新窗口内容_Python | tkinter | 创建窗口

创建一个窗口import tkinter as tk # 实例化对象,建立窗口window window = tk.Tk() # 主窗口循环显示 window.mainloop() # 注意,loop因为是循环的意思,window.mainloop就会让window不断的刷新,如果没有mainloop,就是一个静态的window,传入进去的值就不会有循环,mainloop就相当于一个很大的wh...

weixin_30882521的博客 5578

Tkinter实现页面组件的刷新

Tkinter的after函数

Saltman_LY的博客 8224

Python脚本打包成exe:工具选型、实战流程与排错指南

在Windows环境下,可执行文件(exe)意味着用户无需安装Python解释器即可直接运行程序,这为软件分发提供了极大的便利。理解exe的生成原理,核心在于将解释器、依赖库与业务代码整合为一个独立运行的实体。技术价值体现在免除环境配置、简化交付流程以及提升用户体验,尤其适用于自动化办公脚本、数据分析工具和桌面小应用等场景。然而,打包过程中常遇到依赖缺失、资源路径错误、杀毒误报等问题。本文聚焦Python项目打包为exe的完整方案,重点讲解PyInstaller与Nuitka的选型逻辑、单文件与目录模式的区

weixin_33834910的博客 368

matplotlib画图嵌入tkinter界面并动态更新

tkinter的GUI界面中嵌入matpotlib画图

s_zhchluo的博客 2867

EXE文件全指南:从Python打包到运行故障修复

可执行文件(EXE)是Windows下最常见的软件分发形态,技术上对应PE格式,由操作系统加载器负责解析与运行。借助PyInstaller、Nuitka等工具,Python脚本无需目标环境预装解释器即可一键打包成独立运行的exe程序,极大降低了工具分发和部署成本;同时Java、bat甚至C++项目也有各自的exe生成方案。然而,exe的生成只是起点,运行阶段常遇到依赖缺失、文件关联被篡改(如打开方式变为“%1”)、图标缓存损坏、权限不足无法删除等问题。掌握exe解包、注册表修复和系统级排查命令,是开发者和运

cigang4063的博客 465

Python程序打包exe全攻略:PyInstaller与Nuitka原理对比及实战

Python作为解释型语言,其程序运行依赖本机解释器与第三方库,导致在无Python环境中直接分发脚本难以执行。将“解释器、代码与依赖”封装为可执行文件(exe),成为交付桌面工具、内部自动化脚本或GUI应用的通用解法。打包技术不仅解决了环境依赖问题,还能降低用户使用门槛,并一定程度上保护源码。在实际工程中,PyInstaller以成熟的依赖收集机制和易用性著称,适合快速交付;Nuitka则通过将Python代码转为C再编译为机器码,带来更快的启动速度、更小的体积和更强的反逆向能力。无论是处理Flask-S

weixin_34290631的博客 721

python标准库、threading、multiprocessing、aiomultiprocess、进程/线程 同步、queue(队列)

multiprocessing 包提供了本地和远程并发操作,通过使用子进程而非线程有效地绕过了全局解释器锁。 因此,multiprocessing 模块允许程序员充分利用给定机器上的多个处理器。

freeking101的博客 2万+

Python程序打包exe全攻略:从PyInstaller到Nuitka及常见故障修复

在Windows生态中,exe文件是可执行程序的代名词,承载着从脚本工具到商业软件的运行入口。对于Python开发者而言,将源码打包为exe是分发应用的关键环节,其中PyInstaller与Nuitka是最主流的两种方案,前者以快速收集依赖见长,后者通过编译为C代码提升性能与安全性。然而,打包过程中常遇到依赖缺失、运行环境差异等问题,尤其以Flask-SocketIO服务打包后报错invalid async_mode最为典型,这源于动态导入未被正确收集。此外,用户日常使用时还会遭遇exe打不开、图标变白、文

weixin_33875564的博客 414

Python程序转exe全攻略:原理、PyInstaller参数与Nuitka方案

Python脚本运行依赖解释器和第三方库,在目标机器上往往因缺少环境而无法执行。将程序打包成exe,本质上是把解释器、依赖库、资源文件和入口代码封装为独立的Windows可执行文件,使用户无需配置环境即可双击运行。这种交付方式广泛应用于内部工具分享、客户现场演示和服务器部署。PyInstaller是主流的打包工具,通过静态分析和引导器实现依赖收集;但其单文件模式启动慢、杀毒误报率高等问题也促使开发者关注Nuitka等编译型替代方案。同时,flask_socketio等动态导入库需要显式声明依赖,playwr

weixin_33908217的博客 523

Python项目打包实战:PyInstaller、Docker与PEX方案深度解析

在软件开发和部署过程中,环境依赖管理是一个基础且关键的技术挑战。其核心原理在于确保应用在不同运行环境中具有一致的行为,这直接关系到软件的可移植性和交付效率。从技术价值角度看,有效的依赖打包方案能够显著提升开发运维效率,降低部署复杂度,并保障生产环境的稳定性。常见的应用场景包括桌面应用分发、数据分析脚本交付、命令行工具制作以及云原生微服务部署等。本文聚焦于Python生态,深入探讨了PyInstaller、Docker容器化以及PEX/zipapp这三种主流方案,其中PyInstaller通过静态分析和动态追

cuemes08808的博客 376

Python打包成EXE全指南:PyInstaller原理、实战与问题排查

在日常开发中,Python脚本的分发常受限于运行环境的差异,而将程序打包为Windows可执行文件(EXE)能有效解决依赖与解释器缺失问题。理解打包的本质,是掌握将解释器与依赖库一并封装的技术原理,从而显著提升工具交付效率。主流方案中,PyInstaller凭借命令简洁、跨平台支持广成为首选,适合快速打包Flask服务、PyQt桌面应用等典型场景。本文围绕打包流程、核心参数、资源文件处理展开,同时梳理EXE文件运行时的常见故障,如杀毒软件误报、图标异常、文件关联篡改等,并提供系统级的排查思路。无论是初学者还

weixin_33831673的博客 456

Python 打包 exe 完整实战:从 PyInstaller 到 Nuitka 的排坑指南

在 Windows 环境下,将 Python 脚本分发为免安装的 exe 可执行文件,是降低使用门槛、简化部署流程的关键工程实践。无论是基础的 tkinter 桌面程序,还是依赖 Flask-SocketIO 的实时通信服务,亦或是携带浏览器内核的 Playwright 自动化脚本,都需要通过打包工具将解释器、依赖库与项目代码整合为独立产物。PyInstaller 凭借简单易用和成熟的 hook 机制,适合快速交付;而 Nuitka 通过将 Python 编译为 C 代码,在源码保护和运行效率上更胜一筹。本

weixin_34049948的博客 337

exe体积优化实战:从Python打包到UPX压缩的完整指南

可执行文件体积直接影响软件分发效率、用户下载体验和安全检测结果。Windows程序打包过程中,exe体积可能因捆绑运行时环境而膨胀数倍。掌握体积优化的核心原理——裁剪依赖、压缩二进制、替代运行时,是开发者和工具型团队提升交付质量的关键。遇到Python程序打包生成的exe过大时,可通过PyInstaller的模块排除、UPX压缩和资源精简等组合手段,有效削减安装包体积。对于追求极致轻量的场景,Nuitka、GraalVM等原生编译方案能从源头减少运行时依赖。从体积构成分析到实操案例,一份完整的Windows

weixin_33904756的博客 326

Python 学习 ---> 模块、pypi ( 模块库 )、添加模块路径

什么是 模块 在 Python 中,一个.py文件就是一个模块(Module)。模块的名字就是文件的名字。在模块内部,通过全局变量__name__可以获取模块名(即字符串) 模块作用 为了实现代码的复用,通常会把一些其他程序中重用的代码拿出来单独放在一个程序文件中,

freeking101的博客 3483

UE5新手必看:3种UI定位方法实战(含蓝图配置截图)

本文为UE5新手详细解析了三种核心UI定位方法:屏幕空间、场景空间和世界空间。通过实战蓝图配置与控件操作,指导开发者如何根据HUD、角色血条、3D物体标记等不同应用场景,正确选择并配置UI的定位方式,以实现清晰的信息传递与沉浸式体验。

weixin_29018815的博客 473

Shader之——花草动画shader

今天 ,接到了个需求,花草的动画。谈到花草动画,立马就想到顶点动画,让顶点动起来就可以实现了。但是有个问题,所有的草都往一个方向运动,这个就麻烦了。因为在shader里没有随机这种概念,提到最多的是用一张噪声图来模拟。在网上搜索了一下,发现有更好的办法,就是用每个顶点到一个点的距离来控制动画的开始,毕竟每个顶点到同一个点的距离很少是一样的。 float dis = distance ...

baicaishisan的博客 2184

从脚本到exe:Python与Java程序打包排错实战指南

在Windows环境下,将脚本或项目打包为可执行文件(exe)是软件交付的常见需求。无论是面向普通用户的工具分发,还是内部服务的快速部署,exe都将复杂的运行环境封装为双击即用的体验。然而,不同语言和技术栈的打包路径差异显著:Python开发者常使用PyInstaller或Nuitka,但需处理Flask-SocketIO异步模式失效、Playwright浏览器携带等问题;Java项目则可通过GraalVM Native Image编译为原生exe,或用Launch4j实现轻量级包装。打包过程中,exe文件

ciya3282的博客 338

基于大模型的肾结石诊疗全流程风险预测与方案制定研究报告

目录一、引言1.1 研究背景与意义1.2 国内外研究现状1.3 研究目标与内容二、大模型技术原理与应用概述2.1 大模型的基本原理2.2 大模型在医疗领域的应用进展2.3 适用于肾结石预测的大模型选择与依据三、术前风险预测与准备3.1 患者身体状况评估3.2 结石情况分析3.3 术前准备方案制定四、术中风险预测与应对4.1 出血风险预测与处理4.2 脏器损伤风险预测与预防4.3 实时监测与决策支持五、术后恢复预测与护理5.1 恢复时间预测5.2 护理要点与措施5.3 并发症预防与处理六、并发症风险预测与管理

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1148

在Python Tkinter中实现定时刷新数据

最近正在做一个关于Tkinter的编程,发现Tk虽然通过按键,能实现相关函数的刷新,使得窗口中的数据也实时更新。但我现在冒出这样一个念头,要是我想不通过按键实现某些数据的实时刷新,应该怎么做? 起初我便在Tk编程中加入一个while循环,使数据进行刷新,结果导致程序卡在whlie循环出不来,界面也不好操控。因为Tk是在mian.loop()中进行的实时刷新,在程序中...

weixin_30765319的博客 4148

利用VS2019编写安卓APP的步骤和所遇问题的解决办法

遇到了代码错误,这个可以将鼠标箭头置于错误代码处,这样VS2019给你解决办法,给的方法不能解决,并且读了程序都没有问题,那么你应该重启软件,这样还是不能解决,你尝试重新生成解决方案,还是不能解决有可能是运用的代码与当前版本不相符和、过时了,这个时候应当运用相应版本的代码。注:VS2019编写APP的空间不是很稳定,当你写的代码没有问题,但是出现了报错,可能是空间崩溃了,这个时候可以重启软件。点击“+”号,创建密钥存储,输入“别名”、“密码”、以及下面中的任意一项,直至红色框消失后。

youbestcando的博客 7813

GCJ02坐标系转WGS84坐标系(已实地测试基本无偏差)

坐标系转化,GCJ02坐标系,WGS84坐标系

Xiao_XianYu_的博客 1856

tkinter库使用技巧之监听窗口变化自动刷新组件位置大小

使用tkinter编写好的界面,有时需要改变界面的大小,而拖动改变窗口大小时,代码写好的组件布局不能够自动刷新改变位置和大小,特别是复杂界面,或者使用place布局时,在很长一段时间内我都放弃了对tkinter库写的界面允许改变界面大小,最近偶然发现place的新用法,实现了界面的自动刷新布局,这里记录一下。

m0_46935103的博客 2718

深入解析GEM5 McPAT NoC功耗模型:从arbiter电容计算到微架构关联

本文深入解析GEM5 McPAT NoC功耗模型,重点探讨arbiter电容计算与微架构的关联。通过拆解动态功耗公式和四类电容的物理本质,揭示能量与功率的转换关系,并提供参数调试和模型精度优化的实战技巧,帮助开发者更准确地预测和优化NoC功耗。

weixin_29305313的博客 201

python控制Windows端应用自动化操作的方法有哪些

在 Python 中,常用的库有 pywinauto、pywin32 和 AutoHotkey 等。 pywinauto 是一个基于 Windows 窗口消息的自动化库,它能够通过模拟键盘和鼠标操作来控制 Windows 应用程序。 pywin32 是 Python 的一个扩展,它提供了访问 Windows API 的功能,可以用来自动化 Windows 应用程序。 AutoHotkey 是一个开...

weixin_42590539的博客 1291

SAP MM 物料描述MAKTX 40个字符不够用的问题处理

SAP物料描述表,长度40个字符一般情况下,40个字符在描述中也够用了,但是要加上规格之类的额外描述就不一定了,特别是对于辅助件-刀具。解决方案一:对maktx增强,换成CHAR80或者CHAR100的,但是风险较大,涉及到好多地方,另外SAP+ 算号器 也不支持。解决方案二:增强字段。内部顾问,建议在 那就在这里加一个字段,具体过程如下:1、创建域2、创建架构3、附加架构4、GUI 设置 5、后台设置6、MASS/MM17字段新增。过程1、创建域 SE112、创建结构 se11 3、MARA附加架构

GAVIN 4728

从零搭建云手机:基于Docker与KVM的实战指南

本文提供了一份基于Docker与KVM从零搭建私有云手机的实战指南。详细介绍了服务器配置选择、KVM虚拟化环境检查、Docker容器部署以及通过VNC进行远程访问的全过程。该方案轻量高效,适合应用测试、手游多开及自动化脚本运行等场景,帮助用户低成本拥有高性能云端安卓设备。

weixin_29208327的博客 558
上一篇: chatgpt与图灵测试之间的思考
下一篇: 小米路由作二级路由,挂在上级路由之下,samba能被上级访问(之二)
makefool
博客等级 码龄23年 54粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值