tkinter使用线程池填充treeview

时间:2016-08-08 13:49:17

标签: python multithreading design-patterns tkinter

我正在寻找使用线程填充树视图的“最佳”方法。 我有多个邮件帐户,我正在检查新电子邮件。

我的计划是使用Queue来存储将要检查的帐户 使用check_mail方法。此方法将返回新的列表 邮件。

我可以使用另一个Queue我会填充新邮件和 线程活着的时候以某种方式循环?

是否有任何线程安全,良好的模式来解决这个问题?

2 个答案:

答案 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)