为何Tkinter中Label.config(text=string)内存泄漏,Label["text"]=string却不会?
Tkinter Label使用
config()设置文本引发内存泄漏问题 在排查一个Tkinter程序的内存泄漏问题时,定位到核心原因:在高频执行的监控逻辑中反复调用Label.config(text=字符串)更新文本,会导致内存占用持续上升。
现象验证
修改了相关示例代码,加入tracemalloc观测内存变化:
- 每次点击按钮调用
my_label.config(text = my_text)时,内存占用不断攀升 - 注释该行改用
my_label["text"] = my_text,或使用textvariable绑定变量的方式,内存不再持续增长 - 该问题在OS X、Windows、树莓派系统上均能复现
测试代码
# 导入tkinter所有组件 from tkinter import * import tracemalloc # 创建主窗口 Main_window = Tk() # 待设置的文本内容 my_text = "GeeksforGeeks updated !!!" # 更新Label文本的函数 def counter(): global my_text # 以下两种方式二选一:config会泄漏,[]索引不会 my_label.config(text = my_text) # my_label["text"] = my_text # 打印当前内存占用(单位:字节) print(tracemalloc.get_traced_memory()[0]) # 创建触发更新的按钮 my_button = Button(Main_window, text = "点击更新", command = counter) # 创建初始Label my_label = Label(Main_window, text = "geeksforgeeks") # 布局组件 my_label.pack() my_button.pack() # 启动内存追踪 tracemalloc.start() # 启动GUI主循环 Main_window.mainloop()
临时缓解方案
该泄漏与Python垃圾回收机制相关,导入gc模块并设置内存阈值触发gc.collect()后,可将内存泄漏控制在阈值范围内。
内容的提问来源于stack exchange,提问作者KeithS
相关产品推荐
相关产品推荐

