Tkinter多处理和从另一个类调用函数

时间:2017-01-03 21:07:33

标签: python tkinter

我有一个问题,我想在ThreadedTask类中调用random_task()函数,并且不确定如何执行此操作。我正在使用Python 2.7,如果这有所作为。我也希望能够在某种循环中运行它,这种循环会重复,直到应用程序关闭,但我会在另一个问题中提出这个问题。

import Tkinter as tk
import os, Queue, threading, time

class TestClass(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.create_view()

    def create_view(self):
        self.labelTitle = tk.Label(self, text="page",)
        self.labelTitle.pack()

    def random_task(self):
        print("test")

    def process(self):
        self.queue = Queue.Queue()
        ThreadedTask(self.queue).start()
        self.master.after(100, self.process_queue)

    def process_queue(self):
        try:
            msg = self.queue.get(0)
        except Queue.Empty:
            self.master.after(100, self.process_queue)

class ThreadedTask(threading.Thread):
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue

    def run(self):
        #I want to run random_task() here
        time.sleep(5)
        self.queue.put("Task finished")

app = TestClass()
app.geometry("800x600")
app.mainloop()

1 个答案:

答案 0 :(得分:1)

您需要做的就是像这样延长ThreadedTask

class ThreadedTask(threading.Thread):
    def __init__(self, parent, queue):
        threading.Thread.__init__(self)
        self.parent = parent
        self.queue = queue

    def run(self):
        self.parent.random_task()
        time.sleep(5)
        self.queue.put("Task finished")

然后调用它(来自TestClass):

ThreadedTask(self, self.queue).start()

但是,在您提供的代码中,永远不会调用process()。这样做也会从random_task()类调用ThreadedTask

顺便说一句,这可以在需要时应用于Python中的几乎每个类。

希望这有帮助!