我有一个单窗口tkinter应用程序,它读取存储在单独的python类中的数据以更新接口中的值,反之亦然。我有点合并了传统MVC结构的View和Controller。通过迭代描述窗口小部件类型,其在网格中的XY位置以及一些其他参数的字典来绘制GUI。
当用户从其中一个OptionMenus中选择一个选项或将值输入Entry小部件时,“command”属性用于更新存储在Model类中的值。当用户单击“应用”按钮时,模型将转换为JSON并通过HTTP发送以配置单独的硬件。
有两个“数据库”数据,两者都具有相同的参数,但可以采用不同的配置。为了处理这个问题,有一个按钮可以刷新显示屏以显示另一个银行的值。当远程硬件上的当前值更新时,GUI也会刷新。
我实现这一目标的当前方法是在主窗口中创建一个Frame,并将所有小部件放在其中。当GUI需要刷新时,我循环删除主框架的所有子项:
for child in self.mainFrame.winfo_children():
child.grid_forget()
child.destroy()
del child
然后我删除了Frame本身:
self.mainFrame.grid_forget()
self.mainFrame.destroy()
del self.mainFrame
这一切都是在单击Button时调用的GUI类的方法中完成的。然后调用self.drawGUI()
方法,该方法再次从模型中读取数据并在新帧中绘制所有新小部件。
我遇到的问题是每次单击“刷新”按钮并运行此方法时,内存使用量会增加大约500KB,就像旧的小部件没有被删除一样。我已经在循环中的各个点尝试gc.collect()
但没有运气。我是否正确取消引用小部件?为什么他们不会离开?
附加信息:当我创建小部件时,它们没有被分配给变量,所以我调用这样的函数:
Tk.Button(...)
而不是
button = Tk.Button(...)
我不确定这是否会有所不同。提前谢谢!