I'm not sure if this is the best idea but it works
class Main(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
self.master = master
self.some_service = SomeService()
self.some_service.run()
self.init_gui()
self.after(60000, self.check_for_updates) # Use it to run service
self.after(2000, self.update_gui) # Update GUI every 2 seconds.
def check_for_updates(self):
data = ['a', 'b', 'c', 'd']
self.some_service.populate_job_queue(data)
self.after(60000, self.check_for_updates)
def update_gui(self):
if not self.some_service.update_queue.empty():
update = self.some_service.update_queue.get()
## Do something with update ##
self.text.insert(tk.END, update)
self.after(2000, self.update_gui)
class SomeService(object):
def __init__(self):
self.update_queue = Queue()
self.job_queue = Queue()
def populate_job_queue(self, jobs):
for job in jobs:
self.job_queue.put(job)
def run(self):
for x in range(8):
worker = Thread(target=self.do_something, daemon=True)
worker.start()
def do_something(self):
## Do something with data
while True:
if not self.job_queue.empty():
job = self.job_queue.get()
# Do something
self.update_queue.put(some_data)