Tkinter不确定进度条未运行

2024-10-01 13:38:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在为Python2.7创建一个Tkinter Gui,但在处理进度条时遇到了问题。我需要加载较大的文件到我的程序,这需要一些时间,所以我想得到一个进度条,以显示用户程序没有冻结加载文件。不幸的是,我的进度条在加载文件时似乎没有更新:(我尝试为进度条创建一个新线程,但没有成功。所以我想知道我需要做些什么来让一个不确定的进度条在一个重函数调用期间运行?在

我的代码的相关部分是:

import Tkinter as tk
import ttk as ttk
import pandas as pd
import tkFileDialog as tfgiag

self.pb = ttk.Progressbar(frame, orient=tk.VERTICAL, mode='indeterminate')
mynewdata = tfgiag.askopenfilenames(parent=root,title='Choose a file',filetypes=[('CSV files', '.csv')])
self.t = threading.Thread(target = self.pb.start)
self.t.start()  
#read in each CSV file selected by the user
for myfile in root.tk.splitlist(mynewdata): 
    foo = pd.read_csv(myfile)    
    self.data.appendMainData(foo)
self.pb.stop()

Tags: 文件csv进度条importselftkinterasroot
2条回答

Python的“线程”仍然是通过所谓的GIL全局解释器锁按顺序锁定在一起的。这基本上意味着从同一个python进程派生的线程不会像您希望的那样并行运行。相反,它们都在主python进程上争时间。在

在您的例子中,如果有一个密集的进程要用once进程监视,那么它可能占用GIL,而不会将其释放给线程。在

一个选项:尝试使用readline方法,这样它可以将文件输入工作拆分到足够插入进度条更新行。在

openfile = open(filename, 'r')
for eachline in openfile.readlines():
    append_line(eachline)
    update_progressBar()

另一个更简单的选择是使用python的multiprocessing模块将csv打开卸载到另一个进程。这将模拟您可能更习惯的线程。我将启动一个新进程,读取csv,并将行附加到队列中。完成后,向队列追加一个sentinel值,以表示完成,这样主进程知道何时停止更新进度条并加入生成的进程。比如:

^{pr2}$

在每个self.pb.step(x)语句后使用self.frame.update_idletasks(),其中“x”代表progressbar的值增加的值

相关问题 更多 >