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

sg_后台线程运行函数:.perform_long_operation(func, callback)

在 PySimpleGUI 中,.perform_long_operation() 是一个专门用于 后台长时间运行任务 的方法,它会自动处理线程的创建和回调,比手动使用 start_thread() 更简洁。以下是使用 .perform_long_operation() 重写的示例:


完整代码(使用 .perform_long_operation()

import PySimpleGUI as sg
import math
import timedef calculate_sqrt_sum(window, stop_event):"""后台计算函数(会被自动放到线程中运行)"""total = 10_000_000sum_result = 0.0start_time = time.time()try:for i in range(1, total + 1):if stop_event.is_set():  # 检查是否被取消return None  # 返回None表示计算被取消sum_result += math.sqrt(i)# 每100万次更新一次进度if i % 1_000_000 == 0 or i == total:progress = i / total * 100elapsed = time.time() - start_timewindow.write_event_value('-UPDATE-', (progress, sum_result, elapsed))return (sum_result, time.time() - start_time)  # 返回结果和总用时except Exception as e:window.write_event_value('-ERROR-', str(e))return Nonedef main():stop_event = sg.ThreadSafeEvent()  # 线程安全的事件对象layout = [[sg.Text('计算1000万以内平方根之和')],[sg.ProgressBar(100, key='-PROGRESS-', size=(30, 20))],[sg.Multiline('', size=(40, 5), key='-OUTPUT-', autoscroll=True)],[sg.Text('结果:'), sg.Input('', key='-RESULT-', disabled=True)],[sg.Button('开始'), sg.Button('停止'), sg.Button('退出')]]window = sg.Window('多线程计算示例', layout, finalize=True)while True:event, values = window.read()if event in (sg.WIN_CLOSED, '退出'):stop_event.set()  # 通知线程停止breakelif event == '开始':window['-PROGRESS-'].update(0)window['-RESULT-'].update('')window['-OUTPUT-'].update('计算中...\n')stop_event.clear()window['开始'].update(disabled=True)window['停止'].update(disabled=False)# 使用 perform_long_operation 启动后台任务window.perform_long_operation(lambda: calculate_sqrt_sum(window, stop_event),  # 要执行的任务'-COMPLETED-'  # 任务完成后的回调事件名)elif event == '停止':stop_event.set()window['-OUTPUT-'].print('\n尝试停止计算...')window['停止'].update(disabled=True)elif event == '-UPDATE-':progress, result, elapsed = values[event]window['-PROGRESS-'].update(int(progress))window['-OUTPUT-'].print(f'进度: {progress:.1f}%, 已用时: {elapsed:.2f}秒')elif event == '-COMPLETED-':result = values[event]  # 获取后台任务的返回值if result is None:window['-OUTPUT-'].print('\n计算被取消或出错')else:sum_result, elapsed = resultwindow['-RESULT-'].update(f'{sum_result:.2f}')window['-OUTPUT-'].print(f'\n计算完成! 结果: {sum_result:.2f}, 总用时: {elapsed:.2f}秒')window['开始'].update(disabled=False)elif event == '-ERROR-':sg.popup_error(f'错误: {values[event]}')window['开始'].update(disabled=False)window.close()if __name__ == '__main__':main()

关键改进说明

  1. .perform_long_operation() 的作用

    • 自动在后台线程中执行 calculate_sqrt_sum()
    • 任务完成后触发 -COMPLETED- 事件,并通过 values[event] 返回结果
    • 无需手动管理线程的启动和停止
  2. 线程安全的事件对象

    • 使用 sg.ThreadSafeEvent() 替代 threading.Event(),确保线程安全
  3. 简化的流程

    • 点击"开始" → 启动后台任务 → 任务自动在独立线程中运行
    • 任务完成或取消后,通过 -COMPLETED- 事件通知主线程
  4. 取消任务的处理

    • 设置 stop_event 后,后台任务会在下一次循环检查时退出
    • 返回 None 表示任务被取消

对比 .start_thread() 的优势

特性 .perform_long_operation() .start_thread()
线程管理 自动处理 需手动管理
回调机制 内置(通过事件名) 需手动写事件处理
返回值传递 支持 需额外事件传递
代码复杂度 更低 较高

适用场景

  • 推荐使用 .perform_long_operation()

    • 需要简单后台任务+回调的场景
    • 希望减少线程管理代码
    • 需要直接获取返回值
  • 保留 .start_thread() 的场景

    • 需要同时运行多个独立线程
    • 需要更精细的线程控制(如守护线程)

这个版本更符合 PySimpleGUI 的设计理念,代码更简洁且易于维护。

http://www.gsyq.cn/news/35609.html

相关文章:

  • 小程序设计的底层逻辑:兰亭妙微谈 “轻产品” 如何赢得 “重体验”
  • 2025年上海离婚房产律所权威推荐榜单:离婚律所/房产律所/婚姻律所源头服务商精选
  • 2025年比较好的大型方便面生产线厂家推荐及采购指南
  • qoder,webstorm+通义灵码, trae,codebuddy的使用心得
  • 2025年AI在线客服新标准:如何用智能知识库实现724小时精准服务
  • 2025年口碑好的高速旋转接头行业内知名厂家排行榜
  • 2025年上海婚姻律所权威推荐榜单:继承律所/离婚事务所/离婚房产律所律师精选
  • 2025年如何安装全自动环形绕线机用户口碑最好的厂家榜
  • 2025年北京工程造价咨询机构权威推荐榜单:造价咨询/造价咨询甲级 /工程预算造价咨询源头机构精选
  • 2025年可靠的模压桥架厂家最新实力排行
  • portainer docker-compose.yml
  • 一行代码快速开发 AntdUI 风格的 WinForm 通用后台框架
  • 2025年耐用的别墅电梯行业内口碑厂家排行榜
  • 飞牛os初体验
  • 2025年知名的五星酒店家具厂家最新用户好评榜
  • Python 格式化字符串 _ 优雅群发春节短信
  • MySQL双主Keepalived抢占配置手册
  • LR专业胶片模拟调色预设合集 Film Everything – All Packs
  • Blender柔体布料无限循环游戏动画插件 Revolve Mesh Looper
  • 2025年有实力的人防镀锌风管高评价厂家推荐榜
  • 2025年可靠的石塑地板优质厂家推荐榜单
  • 2025年优秀的轴心加热农用榨油机厂家推荐及采购参考
  • 2025年浅拾(RIOSHINE)兰花双萃致臻精华油:权威深度解析水油双相修护抗衰机制
  • sdenv获取瑞数6后缀
  • 2025年口碑好的玻璃钢储罐行业内知名厂家排行榜
  • 2025年评价高的红木家具厂家推荐及选择参考
  • CF498D Traffic Jams in the Land
  • 2025年优秀的佛山负氧离子床垫行业内知名厂家排行榜
  • 2025年广东回收基恩士传感器公司权威推荐榜单:回收得利捷读码器/回收扫描平台/回收二维码读码器服务商精选
  • 2025年评价高的金属光纤槽厂家最新热销排行