2013-09-26 55 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