我用customtkinter制作了一个桌面应用程序,将txt文件提取到excel中。该应用程序有一个文件选择器按钮和提取按钮。文件选择器将打开txt文件并读取txt文件中的表,提取按钮将进行一些数据操作。我遇到了一些有关性能的问题,当用户单击按钮时,应用程序将在 pandas 提取/进行数据操作时被冻结。我也已经使用另一个线程来进行数据提取。
这里是打开文件的按钮代码:
btn = ctk.CTkButton(master=frame, text='Browse', width=100, command=lambda: Thread(target=self.__select_file).start())
打开文件事件处理程序基本上会让用户选择文件并检查txt文件中的表,然后返回结果对象。该复选框将根据要提取的结果对象启用/禁用。这里是代码:
def __select_file(self):
__file_types = [
('Listing file', ['*psilst*', '*saclst*, *pstlst*', '*psilst', '*saclst', '*pstlst', '*psilst', 'psilst*', 'saclst*', 'pstlst*', 'saclst', 'pstlst']),
('All file', '*.*')
]
self.__reset_checkbox_state()
file = ctk.filedialog.askopenfile(title='Open listing file', initialdir='./', filetypes=__file_types)
if file == None:
self.__set_app_status('No file selected')
self.__listing_file['name'].set('No file selected')
self.__listing_file['file'] = None
return
filename = file.name.split('/')[-1]
self.__listing_file['name'].set(filename)
self.__listing_file['file'] = ReadTextFile(file) ## custom class here
self.__set_app_status('Checking tables in listing file')
result = None
self.__set_submit_btn_config(state=ctk.DISABLED)
result = check_listing_file_table(self.__listing_file['file'])
for key in result:
checked_table: bool = result[key]
state = "normal" if checked_table else "disabled"
temp_key = '_'.join(key.split('_')[1:])
self.__set_checkbox_config(key=temp_key, state=state)
self.__set_app_status('Finish checking tables')
self.__set_submit_btn_config(state=ctk.NORMAL)
有什么建议可以让应用程序在提取txt文件时不被冻结吗?我使用了Thread,但是当文件较大时,应用程序仍然被冻结。
考虑从 pandas 切换到 Polars-
根据他们的网站,他们的性能提升高达 50 倍 - pandas 和 Polars 之间的切换非常容易,因为在基本层面上,它们的工作方式非常相似。
如果性能是您关心的问题,那么这将是您的最佳解决方案。
可以在 pola.rs 上找到该文档 - 强烈推荐,我使用它作为生成器程序来分析数百行数据,并且从未遇到任何性能问题。