【发布时间】:2019-04-25 14:28:59
【问题描述】:
下面的例子会因为tk.createcommand而造成内存泄漏:
import tkinter
import gc
class Foo:
def __init__(self):
self.tk = tkinter.Tcl()
self.tk.createcommand("someCommand", self.someCommand)
def someCommand(self):
pass
if __name__ == "__main__":
while 1:
f = Foo()
# f.tk.deletecommand("someCommand")
# del f
# gc.collect()
如果您删除 tk.createcommand 一切正常,del f 和 gc.collect() 将不起作用,tk.deletecommand 将抛出 _tkinter.TclError: can't delete Tcl command。
有什么方法可以删除创建的命令或者清理内存?我不使用 tkinter GUI,我需要它来调用一些遗留的 tcl 代码。
python
Python 3.7.3 (default, Mar 26 2019, 21:43:19)
[GCC 8.2.1 20181127] on linux
【问题讨论】:
-
泄漏内存的不是命令,而是您创建的整个 Tcl 环境以及
Foo的每个实例。我不知道有什么方法可以处理它。 -
但是如果我删除了
createcommand没有内存泄漏(或者至少泄漏非常缓慢)。那么这是一个错误吗? -
绝对应该可以配置 Tcl 环境,或者至少配置 Tcl 解释器。这设计是一个一次性的上下文(尽管 Tk 有点麻烦)。不过似乎没有暴露。
-
@OcasoProtal:您是否需要为每个新的
Foo()提供一个新的tkinter.Tcl()实例? -
@stovfl 很遗憾,是的,因为遗留代码中的副作用