2016-12-03 67 views
0

我想使用Tkinter與另一個線程進行交互。輸出(假設用戶在兩秒後點擊按鈕)應該是: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

我忘了做「人」可變全球。這是我應該做的,以獲得期望的結果:

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已經是一個巨大的線程循環(你認爲mainloop正在做什麼,它正在循環檢查隊列中的事件進行處理),你不應該把它放在另一個循環中,我們可以使用內置方法來實現這一點。

只是爲了踢我輸入的字符串和隨機創建隨機字符串,所以你可以看到它的工作。

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