Python 3.5 tkinter 确认框创建进度条并读取 csv 不太有效
Python 3.5 tkinter confirmation box created progress bar and reads in csv not quite working
我真的是 python 的新手,正在制作一个 GUI 应用程序来执行大量文件 i/o 和处理。为了完成这个,我想在用户提交和操作时弹出一个确认框。从这里单击 'yes' 应用程序然后运行 i/o 并显示进度条。
从这里的其他线程中,我了解到需要创建一个附加线程来执行这些进程之一(例如 Tkinter: ProgressBar with indeterminate duration and Python Tkinter indeterminate progress bar not running 非常有帮助)。
但是,我有点迷路了,因为我没有从 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_stuff()
中的语句nf.join()
将阻塞tkinter的主循环以显示进度条window。尝试修改 handle_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()
我真的是 python 的新手,正在制作一个 GUI 应用程序来执行大量文件 i/o 和处理。为了完成这个,我想在用户提交和操作时弹出一个确认框。从这里单击 'yes' 应用程序然后运行 i/o 并显示进度条。
从这里的其他线程中,我了解到需要创建一个附加线程来执行这些进程之一(例如 Tkinter: ProgressBar with indeterminate duration and Python Tkinter indeterminate progress bar not running 非常有帮助)。
但是,我有点迷路了,因为我没有从 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_stuff()
中的语句nf.join()
将阻塞tkinter的主循环以显示进度条window。尝试修改 handle_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()