我正在寻找使用线程填充树视图的“最佳”方法。 我有多个邮件帐户,我正在检查新电子邮件。
我的计划是使用Queue
来存储将要检查的帐户
使用check_mail
方法。此方法将返回新的列表
邮件。
我可以使用另一个Queue
我会填充新邮件和
线程活着的时候以某种方式循环?
是否有任何线程安全,良好的模式来解决这个问题?
答案 0 :(得分:0)
你的问题非常广泛,所以答案也是如此。
一般来说,tkinter
在多线程方面不能很好地发挥作用。您可以这样做,但必须确保只有主线程与GUI交互。执行此操作的常用方法是使用universal widget method after()
来定期处理从后台线程发出或从后台线程检索的数据,通常是通过Queue
定期执行。
答案 1 :(得分:0)
我不确定这是不是最好的主意但它有效
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)