0

有谁知道如何从一个线程中调用一个def。

时钟程序:

import sys
from tkinter import *
from tkinter import messagebox
from tkinter import filedialog
from time import sleep
import threading

class MyThread ( threading.Thread ):
    def mclock(): # function that it can't call
        x = 1
        z = 0
        while x != -1:
            Label(mGui,text = str(x) + "second(s)").pack()
            x = x+1
            sleep(1)
            if x == 60:
                x = 1
                z = z+1
            Label(mGui, text= str(z) + " minute(s) has past.").pack()
            return
        return

MyThread().start()

mGui = Tk()

mGui.geometry("300x200+100+100")
mGui.title("Jono's Clock")

menubar = Menu(mGui)

filemenu = Menu(menubar, tearoff = 0)
filemenu.add_command(label = "Clock",command = mclock) # can't use function

menubar.add_cascade(label = "File",menu = filemenu)
mGui.config(menu = menubar)

mGui.mainloop()

如果有人看到任何其他错误,请说明。我也在使用 Windows 7 和 python 3.3。

4

1 回答 1

1

您发布的代码中有几个语法错误,我不确定您对它们的确切用途,因此这里概述了如何从线程运行内容。

如果您希望您的线程从自定义线程类运行您自己的代码,通常的方法是将代码放在一个名为 的方法中run,该方法将在线程启动时自动执行:

import threading

class MyThread(threading.Thread):
    def run(self):
        # do your stuff here
        print("Hello World")

MyThread().start()

或者,如果您不需要类,您可以在模块的顶层创建函数,并将其作为参数传递给threading.Thread的构造函数:

def my_function():
    print("Hello World")

threading.Thread(target=my_function).start()

请注意,您通常希望保留对线程对象的引用,而不是像上面的代码那样放手。这需要您使用两行来创建然后启动线程:

thread = MyThread() # or the alternative version
thread.start()

这让您以后可以:

thread.join()

这确保线程已完成其工作。

于 2013-09-26T19:35:57.390 回答