Python&;tkinter,在打开和关闭对话框时遇到内存泄漏
我正在编写一个GUI与数据库接口。GUI要求用户登录。如果尝试连接到数据库失败,我将创建一个错误对话框。我一直在观看任务管理器,每次出现错误对话框时,程序使用的内存都会有一点跳跃。我想我可能对特金特有误解。感谢您的帮助。所有相关代码如下。我想我已经把漏洞指向Python&;tkinter,在打开和关闭对话框时遇到内存泄漏,python,tkinter,memory-leaks,Python,Tkinter,Memory Leaks,我正在编写一个GUI与数据库接口。GUI要求用户登录。如果尝试连接到数据库失败,我将创建一个错误对话框。我一直在观看任务管理器,每次出现错误对话框时,程序使用的内存都会有一点跳跃。我想我可能对特金特有误解。感谢您的帮助。所有相关代码如下。我想我已经把漏洞指向了,除了LogInWindow.enter_cb()中的。我知道这个类没有正确缩进。无法正确格式化文本 主函数在main循环上启动LogInWindow 从tkinter导入* 从tkinter导入ttk 类错误窗口(Tk): “”“用于显示
了,除了LogInWindow.enter_cb()
中的。我知道这个类没有正确缩进。无法正确格式化文本
主函数在main循环上启动LogInWindow
从tkinter导入*
从tkinter导入ttk
类错误窗口(Tk):
“”“用于显示数据库登录错误的窗口”“”
定义初始化(自身,例外):
Tk.\uuuuuu初始(自我)
self.title('MySQL错误')
自我调整大小(False,False)
错误=文本(自身,高度=2,包裹=文字,浮雕=平面)
错误.insert(结束'MySQL{!r}'。格式(异常))
错误。标记_配置(“中心”,justify='center'))
错误。标记添加(“中心”,1.0,“结束”)
error.config(状态=已禁用)
错误。配置(bg=self.cget('bg'))
错误.pack(padx=5,pady=(5,0))
ok=ttk.按钮(self,text='ok',command=self.\u退出)
好的。绑定(“”,self.\u退出)
好的。打包(padx=5,pady=5)
#root.grab_set()
好的,焦点集()
def_退出(self,*args):
自我毁灭
类登录窗口(Tk):
“”“获取用户数据库凭据的窗口”“”
连接=无
定义初始化(自):
Tk.\uuuuuu初始(自我)
self.title('输入凭据')
自我调整大小(False,False)
主框架=ttk.框架(自身)
主框架组件(填充=两者,扩展=真,padx=20,pady=5)
入口框架=ttk.frame(主框架)
入口_frame.pack()
u_label=ttk.label(输入框,text='Username')
p_label=ttk.label(输入框,text='Password')
self.usern=ttk.Entry(Entry\u框架)
self.passw=ttk.Entry(Entry_frame,show='*'))
self.usern.bind(“”,self.enter_cb)
self.passw.bind(“”,self.enter_cb)
u_label.grid(行=0,列=0,padx=15,pady=5)
self.usern.grid(行=0,列=1,padx=(0,15),pady=5)
p_标签网格(行=1,列=0,padx=15,pady=5)
self.passw.grid(行=1,列=1,padx=(0,15),pady=5)
按钮帧=ttk帧(自)
按钮\框架包()
enter=ttk.Button(按钮框,文本='enter',命令=self.enter\U cb)
cancel=ttk.Button(按钮框,text='cancel',command=self.cancel\u cb)
enter.bind(“”,self.enter_cb)
取消绑定(“”,self.cancel\u cb)
输入.pack(侧=左,padx=10,pady=10)
取消包装(侧面=左侧,padx=10,pady=10)
self.usern.focus\u set()
def输入_cb(自身,*参数):
“”“为创建数据库连接或弹出错误对话框输入callback”“”
尝试:
#与数据库建立连接
导入pymysql.cursors
self.connection=pymysql.connect(host='localhost',
user=self.usern.get(),
password=self.passw.get(),
db='databasename',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
自我毁灭
除了pymysql.err.error作为e之外:
#创建一个错误对话框
错误=错误窗口(e)
中心(错误)
错误。mainloop()
#del(错误)
def cancel_cb(自身,*参数):
“”“为销毁窗口而取消回调”“”
自我毁灭
问题的一部分在于,您不应该有超过一个Tk
的实例。如果要创建对话框,它需要是Toplevel
的子类,而不是Tk
一个设计良好的tkinter程序应该明确地创建根窗口(Tk()
)一次,并调用mainloop
一次 问题的一部分是,您不应该有超过一个Tk
的实例。如果要创建对话框,它需要是Toplevel
的子类,而不是Tk
一个设计良好的tkinter程序应该明确地创建根窗口(Tk()
)一次,并调用mainloop
一次 你的缩进不正确。请尝试修复它。是的,我在OP中引用了它,但是如果不在每行中添加4个空格,我无法将类语句放入代码块中。很抱歉有更好的方法吗?我没有在Soy上发帖的经验。你可以突出显示所有代码,然后单击看起来像{}
的按钮,将所有内容缩进四个空格。请参见,您还可以突出显示所有代码,然后按CTRL+K
以获得与按{}
按钮相同的结果。谢谢。下次缩进不正确时,请记住提示。请尝试修复它。是的,我在OP中引用了它,但是如果不在每行中添加4个空格,我无法将类语句放入代码块中。很抱歉有更好的方法吗?我没有在Soy上发帖的经验。你可以突出显示所有代码,然后单击看起来像{}
的按钮,将所有内容缩进四个空格。请参见,您还可以突出显示所有代码,然后按CTRL+K
以获得与按{}
按钮相同的结果。谢谢。下次我会记住这些提示谢谢,我会做出适当的调整。还有一个问题。我的登录窗口是否也应该是Toplevel
的子类,而实际的程序子类是Tk
?而且我比你高,我只是没有足够的声誉。编辑:谢谢这修复了我的问题!我理解Tk
和Toplevel
之间的关系。再次感谢你的洞察力。谢谢你的帮助