如何在PythonSimpleGUI中修改进度条最大值为CSV列表长度?
问题描述
我想要创建一个以列表长度为最大值的进度条。初始时将其最大值设为1000,但希望在读取CSV文件并获取列表长度后修改该最大值,不过未能达到预期效果。请问该如何实现?
当前代码
from read_csv import get_csv_list file_input_col = [sg.Text('CSV file'), sg.InputText(key='INPUT_FILE', enable_events=True, size=(45,1)), sg.FileBrowse('browse', file_types=((('CSV file', '*.csv'),)))] ok_button = [sg.OK()] cancel_button = [sg.Cancel()] progress_bar = [sg.ProgressBar(1000, orientation='h', size=(20, 20), key='progressbar')] # window layout layout = [ file_input_col, ok_button, cancel_button, progress_bar] # Create window object window = sg.Window('test', layout) progress_bar = window['progressbar'] # loop while True: event, values = window.read() if event == sg.WIN_CLOSED: break if event =='OK': keyword_list = get_csv_list(values['INPUT_FILE']) progress_bar.update(max=len(keyword_list)) for i in range(1000): # I will change this for loop later progress_bar.UpdateBar(i+1) event, values = window.read(timeout=10) if event == 'Cancel' or event == sg.WIN_CLOSED: progress_bar.UpdateBar(0) break window.close()
解决方案
问题出在两处:一是修改进度条最大值后,循环仍用固定的range(1000),导致进度和实际列表长度不匹配;二是混用了PySimpleGUI的进度条更新方法(大小写不一致)。
修改后的代码如下:
from read_csv import get_csv_list import PySimpleGUI as sg file_input_col = [sg.Text('CSV file'), sg.InputText(key='INPUT_FILE', enable_events=True, size=(45,1)), sg.FileBrowse('browse', file_types=(('CSV file', '*.csv'),))] ok_button = [sg.OK()] cancel_button = [sg.Cancel()] progress_bar = [sg.ProgressBar(1000, orientation='h', size=(20, 20), key='progressbar')] layout = [file_input_col, ok_button, cancel_button, progress_bar] window = sg.Window('test', layout) progress_bar = window['progressbar'] while True: event, values = window.read() if event == sg.WIN_CLOSED: break if event == 'OK': keyword_list = get_csv_list(values['INPUT_FILE']) list_length = len(keyword_list) # 更新进度条最大值并重置进度 progress_bar.update(max=list_length, current_count=0) # 按实际列表长度循环 for i in range(list_length): # 更新当前进度 progress_bar.update(current_count=i+1) event, values = window.read(timeout=10) if event == 'Cancel' or event == sg.WIN_CLOSED: progress_bar.update(current_count=0) break window.close()
关键修改说明
- 用
list_length存储读取到的列表长度,替换固定的1000作为循环范围 - 使用
progress_bar.update(max=list_length)正确设置最大值,同时current_count=0重置初始进度 - 统一使用
update(current_count=...)更新进度(PySimpleGUI新版推荐此写法,替代旧版UpdateBar) - 取消操作时同样用
update(current_count=0)重置进度条
内容的提问来源于stack exchange,提问作者user18709667
相关产品推荐
相关产品推荐

