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