如何解决使用 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 进程栏。
我能想到的两个解决方案是:
这些解决方案听起来都不是很好。我还有其他方法可以做到这一点吗?
解决方法
为您的 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 举报,一经查实,本站将立刻删除。