Tkinter 和线程来控制连续的后台进程

Tkinter and threading to control continuous background process

我想使用 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()

编辑:您的 name 变量永远不会更改,因为它们是 local 它们所在的各个函数。即使它确实有效,这也是一种糟糕的方法。 Tkinter 已经是一个巨大的线程循环(你认为 mainloop 在做什么,它正在循环检查队列中的事件以进行处理)你不应该将它放在另一个循环中,我们可以使用内置方法来做到这一点。

为了好玩,我导入了 string 和 random 以创建随机字符串,这样您就可以看到它的工作原理。

changeName 函数可以使用 sleep 但我们已经导入了 tkinter 并且它已经具有内置功能/事件队列所以为什么不使用它...

我只是将名称作为属性添加到 Tk class 而不必担心全局变量、局部变量等

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

我忘了将 "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()