2016-12-03 27 views
0

Tkinterを使って別のスレッドとやりとりしたいと思っています。出力は(ユーザーが2秒後にボタンをクリックしたと仮定して):Tkinterとスレッドを使って連続的なバックグラウンドプロセスを制御する

Steve 
Steve 
Joline 
Joline 
Joline 

どこが間違っていますか?

from Tkinter import * 
import time 
import threading 
from threading import Thread 


def changeName(): 
    person = "Joline" 


def controls(): 
    root = Tk() 
    button = Button(text="Change Name", command=changeName) 
    button.pack(side=LEFT) 
    root.mainloop() 


def work(): 
    person = "Steve" 
    for _ in range(5): 
     print("hello " + person) 
     time.sleep(1) 


Thread(target = controls).start() 
Thread(target = work).start() 
+0

Tkでこのようなスレッドを使用しないでください。 – Pythonista

+0

私ができることは可能ですか? –

+0

はい、私はしばらくのうちに回答を投稿します。 – Pythonista

答えて

0

"person"変数をグローバルにすることを忘れてしまいました。

from Tkinter import * 
import time 
import threading 
from threading import Thread 

person = "" 

def changeName(): 
    global person 
    person = "Sonia" 


def controls(): 
    root = Tk() 
    button = Button(text="Change Name", command=changeName) 
    button.pack(side=LEFT) 
    root.mainloop() 


def work(): 
    for _ in range(10): 
     print("hello " + person) 
     time.sleep(1) 


Thread(target = controls).start() 
Thread(target = work).start() 
1

編集:彼らは、彼らがしている各機能へローカルあるので、あなたのname変数が変更されることはありません。これは、それが仕事をしていても悪いアプローチです。 Tkinterはすでに1つの巨大なスレッドループです(mainloopは何をしていると思いますか?処理するキューのイベントをループしていると思います)。別のループの中に入れてはいけません。

ちょうどキックのために、ランダムな文字列を作成するためにstringとrandomをインポートしましたので、動作していることがわかりました。 ...

changeName機能は、睡眠を使用することができますが、我々はすでにTkinterには、インポートされていると、それがすでに組み込まれている機能/イベントキューので、それを使用しないで、なぜ私はちょうどのTkの属性として名前を追加しましたクラス、グローバルなどを気にする必要はありません。

import tkinter as tk, string, random 

root = tk.Tk() 
root.name = "a name" 

def changeName(shouldRun=False): 

    if not shouldRun: 
     root.after(2000, changeName, True) 
    else: 
     root.name = "".join([random.choice(string.ascii_letters) for _ in range(10)]) 

def printName(): 

    print(root.name) 
    root.after(1000, printName) 

btn = tk.Button(root, text="Change Name", command=changeName) 
btn.pack() 
printName() 
root.mainloop() 
関連する問題