May-27-2020, 08:17 AM
(May-26-2020, 09:00 PM)Yoriz Wrote: It can't be dumbed down your just out of your depth at the moment, you need to spend some more time in the paddling pool before jumping in the deep endOk thank you I will spend more time reading and watching tutorials :)![]()
import functools import random import time import tkinter as tk from concurrent import futures thread_pool_executor = futures.ThreadPoolExecutor(max_workers=1) def tk_after(target): @functools.wraps(target) def wrapper(self, *args, **kwargs): args = (self,) + args self.after(0, target, *args, **kwargs) return wrapper def submit_to_pool_executor(executor): '''Decorates a method to be sumbited to the passed in executor''' def decorator(target): @functools.wraps(target) def wrapper(*args, **kwargs): result = executor.submit(target, *args, **kwargs) result.add_done_callback(executor_done_call_back) return result return wrapper return decorator def executor_done_call_back(future): exception = future.exception() if exception: raise exception class MainFrame(tk.Frame): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.label = tk.Label(self, text='not running') self.label.pack() self.button = tk.Button( self, text='blocking task', command=self.on_button) self.button.pack(pady=15) self.pack() def on_button(self): print('Button clicked') self.blocking_code() @tk_after def set_label_text(self, text=''): self.label['text'] = text @tk_after def set_button_state(self, enabled=True): state = 'normal' if not enabled: state = 'disabled' self.button['state'] = state @submit_to_pool_executor(thread_pool_executor) def blocking_code(self): self.set_button_state(False) self.set_label_text('running') time.sleep(0.5) words = ["roll left", "pull", "duck", "roll right", "slip"] for choice in random.sample(words, len(words)): self.set_label_text(choice) time.sleep(0.5) self.set_label_text('not running') self.set_button_state(True) if __name__ == '__main__': app = tk.Tk() main_frame = MainFrame() app.mainloop()