2

我有一个单窗口 tkinter 应用程序,它读取存储在单独的 python 类中的数据以更新接口中的值,反之亦然。我在一定程度上合并了传统MVC结构的View和Controller。GUI 是通过迭代一个描述小部件类型、它在网格中的 XY 位置和一些其他参数的字典来绘制的。

当用户从 OptionMenus 中选择一个选项或在 Entry 小部件中输入值时,“命令”属性用于更新存储在 Model 类中的值。当用户单击“应用”按钮时,模型将转换为 JSON 并通过 HTTP 发送以配置单独的硬件。

有两个数据“银行”,它们都具有相同的参数,但可以进行不同的配置。为了处理这个问题,有一个按钮可以刷新显示以显示来自另一家银行的值。当远程硬件上的当前值更新时,GUI 也会刷新。

我实现这一点的当前方法是在主窗口中创建一个框架,并将所有小部件放在其中。当 GUI 需要刷新时,我会循环删除主框架的所有子框架:

for child in self.mainFrame.winfo_children():
    child.grid_forget()
    child.destroy()
    del child

然后我删除框架本身:

self.mainFrame.grid_forget()
self.mainFrame.destroy()
del self.mainFrame

这一切都是在单击按钮时调用的 GUI 类的方法中完成的。self.drawGUI()然后调用该方法再次从模型中读取数据并在新框架中绘制所有新小部件。

我遇到的问题是,每次单击“刷新”按钮并运行此方法时,内存使用量都会增加大约 500KB,就好像旧的小部件没有被删除一样。我已经尝试过gc.collect()循环中的各个点,但没有运气。我是否正确取消引用小部件?他们怎么不走?

附加信息:当我创建小部件时,它们没有被分配给变量,所以我这样调用函数:

Tk.Button(...)

而不是

button = Tk.Button(...)

我不确定这是否会有所作为。提前致谢!

4

0 回答 0