使用 PySimpleGUI 创建自定义进度条

如何解决使用 PySimpleGUI 创建自定义进度条

我刚刚开始学习 PySimpleGUI,我想创建一个自定义 GUI 进度条,以显示程序的哪些部分在不同时间运行。

例如,我有一个包含各种组件的视频处理程序,所以我希望进度条显示如下文本:

'从视频中提取第 1 帧'

'裁剪图像'

'删除重复图像'

但是所有这些行都需要从程序中的不同函数更新进度条窗口,其中与包含进度条的窗口相关联的 GUI 代码没有运行。

我的代码

    image_name_list = Frame_Capture(f"{main_dir}\\{input_line2}.mp4")  # Generates image list of frames of video
    Remove_Duplicates(image_name_list)  # Removes duplicate images
    print("Enter name of pdf file")
    pdf_name = f'{input()}.pdf'
    makePdf(pdf_name,image_name_list)  # Converts images to pdf
    Cleanup(image_name_list)  # Deletes unneeded images
    os.startfile(pdf_name)

在这里,当我的程序本身的 GUI 组件在程序的另一部分运行时,我需要从“Frame_Capture”、“Remove_Duplicates”、“makePDF”和“Cleanup”函数中更新 GUI 进程栏。

我能想到的两个解决方案是:

  1. 全局创建我的窗口并全局更新其中的进度条
  2. 当我的程序到达需要更新进度条的部分时,将我所有的进度条语句逐行写入文本文件,同时每隔几毫秒将文本文件中的最新语句加载到我的进度条中。
  3. 立>

这些解决方案听起来都不是很好。我还有其他方法可以做到这一点吗?

解决方法

为您的 GUI 制作一个主事件循环。当任何函数需要更新 GUI 时,使用 write_event_value(key,value) 将事件写入主窗口。示例:

def test():
    import threading
    layout = [[sg.Text('Testing progress bar:')],[sg.ProgressBar(max_value=10,orientation='h',size=(20,20),key='progress_1')]]

    main_window = sg.Window('Test',layout,finalize=True)
    current_value = 1
    main_window['progress_1'].update(current_value)

    threading.Thread(target=another_function,args=(main_window,),daemon=True).start()

    while True:
        window,event,values = sg.read_all_windows()
        if event == 'Exit':
            break
        if event.startswith('update_'):
            print(f'event: {event},value: {values[event]}')
            key_to_update = event[len('update_'):]
            window[key_to_update].update(values[event])
            window.refresh()
            continue
        # process any other events ...
    window.close()

def another_function(window):
    import time
    import random
    for i in range(10):
        time.sleep(2)
        current_value = random.randrange(1,10)
        window.write_event_value('update_progress_1',current_value)
    time.sleep(2)
    window.write_event_value('Exit','')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?