Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python&;tkinter,在打开和关闭对话框时遇到内存泄漏_Python_Tkinter_Memory Leaks - Fatal编程技术网

Python&;tkinter,在打开和关闭对话框时遇到内存泄漏

Python&;tkinter,在打开和关闭对话框时遇到内存泄漏,python,tkinter,memory-leaks,Python,Tkinter,Memory Leaks,我正在编写一个GUI与数据库接口。GUI要求用户登录。如果尝试连接到数据库失败,我将创建一个错误对话框。我一直在观看任务管理器,每次出现错误对话框时,程序使用的内存都会有一点跳跃。我想我可能对特金特有误解。感谢您的帮助。所有相关代码如下。我想我已经把漏洞指向了,除了LogInWindow.enter_cb()中的。我知道这个类没有正确缩进。无法正确格式化文本 主函数在main循环上启动LogInWindow 从tkinter导入* 从tkinter导入ttk 类错误窗口(Tk): “”“用于显示

我正在编写一个GUI与数据库接口。GUI要求用户登录。如果尝试连接到数据库失败,我将创建一个错误对话框。我一直在观看任务管理器,每次出现错误对话框时,程序使用的内存都会有一点跳跃。我想我可能对特金特有误解。感谢您的帮助。所有相关代码如下。我想我已经把漏洞指向
了,除了
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
之间的关系。再次感谢你的洞察力。谢谢你的帮助