📜  PySimpleGUI 中的异步用法(1)

📅  最后修改于: 2023-12-03 15:04:01.955000             🧑  作者: Mango

PySimpleGUI 中的异步用法

PySimpleGUI 是一个易于使用的 Python GUI 库,可以快速创建简单的窗口和表单等。它还提供了一些异步用法,通过使用异步以避免阻塞 GUI 的执行。以下是 PySimpleGUI 中异步用法的介绍。

asyncio 和 asyncio GUI

PySimpleGUI 中有一个内置的 async 容器,与 asyncio.StructuredAsyncio 封装在一起,以提供多线程事件处理程序。使用这些工具时,可以避免阻塞 GUI 线程,从而提高 GUI 的响应性。以下是一个示例:

import PySimpleGUI as sg
import asyncio

async def coro():
    print('start')
    await asyncio.sleep(2)
    print('finish')

layout = [[sg.Text('Testing async')],
        [sg.Button('Async'), sg.Button('Exit')]]

window = sg.Window('Window', layout, finalize=True)

while True:
    event, values = window.read(timeout=100)  # Poll every 100 ms

    if event == sg.WIN_CLOSED or event == 'Exit':
        break
    elif event == 'Async':
        asyncio.run(coro())

window.close()

在上面的代码中,我们使用 asyncio.run(coro()) 启动异步事件处理程序。coro() 函数会等待 2 秒钟后再结束。在窗口上单击Async 按钮时,我们使用 asyncio 启动 coro() 函数。

Threading

使用 PySimpleGUI.asyncioPySimpleGUI.multithreading,我们还可以在 PySimpleGUI 应用程序中创建后台线程。甚至可以在 GUI 和异步运行在不同的线程中。

以下是一个示例:

import PySimpleGUI as sg
import threading
import time

def infinite_loop():
    while True:
        print('hello')
        time.sleep(1)

sg.theme('Dark')

layout = [[sg.Text('Infinite loop example:')],
          [sg.Output(size=(40,10))],
          [sg.Checkbox('Run in background', default=True)],
          [sg.Exit()]]

window = sg.Window('Window', layout)

background_thread = None

while True:
    event, values = window.read()

    if event == 'Exit':
        break

    if not background_thread or not background_thread.is_alive():
        if values[0]:
            background_thread = threading.Thread(target=infinite_loop, daemon=True)
            background_thread.start()
        else:
            infinite_loop()

window.close()

在上述代码片段中,我们使用 PySimpleGUI.multithreading 模块中的方法来创建一个后台线程以启动 infinite_loop 函数(无限循环输出)。

总结

在 PySimpleGUI 中使用 asyncio 和 threading 模块可以大大提高程序的响应性,同时可以避免阻塞 GUI 的执行。这使得我们可以在保持应用程序的可操作性的同时执行长时间运行的任务。