2013-09-26 26 views
0

是否有人知道如何调用一个线程的def表单。从线程调用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。

回答

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() 

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

+0

这有助于我理解,但我不确定仍然是这样,我已经把完整的代码,而不是示例。 – Minigeek22

+0

我想你想让你的线程类的词像我的代码,然后让你的菜单选项创建'线程'对象并启动它。没有内置的方法可以在另一个线程中运行一个函数,除非以该函数为目标启动一个新线程,或者使用一堆代码在线程之间实现一个消息传递系统,该系统可以包含要运行的作业。 – Blckknght