Python 3.x Python3.5 tkinter确认框创建了进度条,并读取csv,但不太正常

Python 3.x Python3.5 tkinter确认框创建了进度条,并读取csv,但不太正常,python-3.x,user-interface,tkinter,progress-bar,Python 3.x,User Interface,Tkinter,Progress Bar,我是python新手,正在制作一个GUI应用程序,它可以进行大量的文件I/o和处理。为了完成这一点,我希望在用户提交和执行操作时弹出一个确认框。单击“是”后,应用程序将从此开始运行i/o并显示进度条 从这里的其他线程中,我已经了解了创建附加线程以执行其中一个进程的需求(例如,非常有用) 但是,我有点迷路了,因为我没有从Main()函数激活线程化进程。因此,我仍然不知道如何以及在何处创建进度条,并将I/o进程传递给另一个线程(在这里读取csv文件) 这是我的代码,我非常感谢任何人能给我的帮助: i

我是python新手,正在制作一个GUI应用程序,它可以进行大量的文件I/o和处理。为了完成这一点,我希望在用户提交和执行操作时弹出一个确认框。单击“是”后,应用程序将从此开始运行i/o并显示进度条

从这里的其他线程中,我已经了解了创建附加线程以执行其中一个进程的需求(例如,非常有用)

但是,我有点迷路了,因为我没有从Main()函数激活线程化进程。因此,我仍然不知道如何以及在何处创建进度条,并将I/o进程传递给另一个线程(在这里读取csv文件)

这是我的代码,我非常感谢任何人能给我的帮助:

import tkinter as tk
import tkinter.messagebox as messagebox
import csv
import tkinter.ttk as ttk
import threading

class ReadIn(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent
        self.initUI()

    def initUI(self):
        self.parent.title("Read in file and display progress")
        self.pack(fill=tk.BOTH, expand=True)

        self.TestBtn = tk.Button(self.parent, text="Do Something", command=lambda: self.confirm_pb())
        self.TestBtn.pack()

    def confirm_pb(self):
        result = messagebox.askyesno("Confirm Action", "Are you sure you want to?")
        if result:
            self.handle_stuff()

    def handle_stuff(self):
        nf = threading.Thread(target=self.import_csv)
        nf.start()
        self.Pbar()
        nf.join()

    def Pbar(self):
        self.popup = tk.Tk()
        self.popup.title('Loading file')
        self.label = tk.Label(self.popup, text="Please wait until the file is created")
        self.progressbar = ttk.Progressbar(self.popup, orient=tk.HORIZONTAL, length=200,
                                           mode='indeterminate')
        self.progressbar.pack(padx=10, pady=10)
        self.label.pack()
        self.progressbar.start(50)


    def import_csv(self):
        print("Opening File")
        with open('csv.csv', newline='') as inp_csv:
            reader = csv.reader(inp_csv)
            for i, row in enumerate(reader):
                # write something to check it reading
                print("Reading Row " + str(i))

def main():
    root = tk.Tk()  # create a Tk root window
    App = ReadIn(root)
    root.geometry('400x300+760+450')
    App.mainloop()  # starts the mainloop

if __name__ == '__main__':
    main()

函数
handle\u stuff()
中的语句
nf.join()
将阻止tkinter的主循环以显示进度条窗口。尝试修改
handle\u stuff()
,如下所示:

def handle_stuff(self):
    nf = threading.Thread(target=self.import_csv)
    nf.start()
    self.Pbar()
    #nf.join() # don't call join() as it will block tkinter's mainloop()
    while nf.is_alive():
        self.update() # update the progress bar window
    self.popup.destroy()