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

上記のコードのようにスレッド オブジェクトへの参照を手放すのではなく、スレッド オブジェクトへの参照を保持したい場合が多いことに注意してください。これには、次の 2 行を使用してスレッドを作成し、開始する必要があります。

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

これにより、後で次のことができます。

thread.join()

これにより、スレッドが作業を完了したことが保証されます。

于 2013-09-26T19:35:57.390 に答える