tkinter多进程场景下点击按钮修改全局变量不生效问题求助
问题根本原因
Python的multiprocessing模块创建的子进程拥有独立的内存空间,会复制父进程的所有资源生成独立副本。你代码里的全局变量var_a在tkinter所在的主进程、pro_function所在的子进程中是两个完全独立的对象,主进程点击按钮修改的只是主进程内存中的var_a,子进程的变量副本完全不会同步更新,因此出现“修改不生效、值自动恢复”的现象。
解决方案
使用multiprocessing提供的共享内存对象实现跨进程变量同步,单值变量直接用Value类即可,修改后可运行的代码如下:
from multiprocessing import Process, Value from tkinter import * import time root = Tk() # 定义整数类型的共享变量,初始值为10 var_a = Value('i', 10) def set_callback(): global var_a # 访问共享变量的值需要通过.value属性 var_a.value = int(e1.get()) print(var_a.value) def pro_function(): global var_a while True: print(var_a.value) time.sleep(0.1) e1 = Entry(root) e1.pack(pady=12) button1 = Button(root, text="Set Var", command = set_callback ) button1.pack(pady=12) if __name__ == '__main__': root.geometry('350x218') root.title("PythonLobby") x = Process(target=pro_function) x.start() root.mainloop() x.join()
核心修改点
- 新增导入
multiprocessing.Value,该类专门用于实现跨进程的基础类型变量共享 - 将原来的普通全局变量替换为
Value类型的共享变量,第一个参数'i'代表整数类型,第二个参数为初始值 - 所有读写变量的位置都改为通过
.value属性访问共享变量的实际值
如果后续需要共享更复杂的数据结构,可以用multiprocessing.Manager提供的列表、字典等共享容器,或者用Queue实现进程间的消息传递。
内容的提问来源于stack exchange,提问作者vahid ajal
相关产品推荐
相关产品推荐

