from tkinter import *from tkinter.ttk import *import timeimport threadingimport requestsfrom bs4 import BeautifulSoupurl3 = 'http://stackoverflow.com/questions/31241112/blocking-tkinter-interface-until-thread-finishes-its-task'class Interface: def __init__(self, master): self.mutex = threading.Lock() self.m_list = [] self.master = master self.browse_button= Button (master, text="Browse", command=self.browser) self.browse_button.pack() # Create an indeterminate progressbar here but don't pack it. # Change the maximum to change speed. Smaller == faster. self.progressbar = Progressbar(mode="indeterminate", maximum=20) def browser (self): self.start = time.time() # set up thread to do work in self.thread = threading.Thread(target=self.read_file, args=("filename",)) # disable the button self.browse_button.config(state="disabled") # show the progress bar self.progressbar.pack() # change the cursor self.master.config(cursor="wait") # force Tk to update self.master.update() # start the thread and progress bar self.thread.start() self.progressbar.start() # check in 50 milliseconds if the thread has finished self.master.after(50, self.check_completed) def check_completed(self): if self.thread.is_alive(): # if the thread is still alive check again in 50 milliseconds self.master.after(50, self.check_completed) else: # if thread has finished stop and reset everything self.progressbar.stop() self.progressbar.pack_forget() self.browse_button.config(state="enabled") self.master.config(cursor="") self.master.update() # Call method to do rest of work, like displaying the info. self.display_file() def read_file (self, filename): # time.sleep(7) # actually do the read here self.mutex.acquire() try: resp = requests.get(url3) soup = BeautifulSoup(resp.content, 'html.parser') for link in soup.select('a'): self.m_list.append(link.get('href')) finally: self.mutex.release() def display_file(self): new_list = [] for i in self.m_list: # print type(i) # unicode new_list.append(str(i).strip('\n')) self.cp(new_list) def cp(self, new_list): tp = Toplevel(self.master) text = Text(tp) text.pack() text.insert(1.0, '\n'.join(new_list)) print time.time() - self.startwindow = Tk()starter = Interface(window)window.mainloop()