我使用ttk
(tkinter
)的after方法实时更新/创建一些标签。我已经调整了这个SO question的代码但是我注意到一段时间后屏幕停止响应。我不确定多久但是当我启动程序时,一切似乎都运行良好。当我在没有关闭UI的情况下睡觉时,返回时会冻结并在几秒钟后解冻,让我在冻结前几秒钟进行交互。
我不知道导致这种行为的原因,但我怀疑是在哪里进行sqlite查询以显示数据库中的总记录。或者我可能在一个函数中做了太多的标签更新。请参阅下面的update_lbl
方法。
有关尝试实现的内容的预览,请参阅image
class ReptoUI(ttk.Notebook):
def __init__(self, parent):
ttk.Notebook.__init__(self, parent)
self.parent = parent
self.parent.title("Repto Mail Checker")
self.frame1 = ttk.Frame(self.parent, borderwidth=2, relief='groove') # first page,
self.frame1.grid(column=0, row=0, sticky=(N, S, E, W))
self.con() # configure columns
self.frame2 = ttk.Frame(self.parent, borderwidth=2, relief='raised') # second page,
self.frame2.grid(column=9, row=11, columnspan=11, rowspan=11)
self.add(self.frame1, text="Checker")
self.add(self.frame2, text="Sender")
self.mail_server = StringVar()
self.mail_port = IntVar()
self.protocol = StringVar()
self.folder = StringVar()
self.mail_type = StringVar()
self.username = StringVar()
self.password = StringVar()
self.log_checker = BooleanVar()
self.interval = IntVar()
self.initUI()
self.centerWindow()
def con(self):
for i in range(11):
self.frame1.grid_columnconfigure(i, weight=1)
# self.frame1.grid_rowconfigure(i, weight=1)
def update_lbl(self):
session = setup_db()
total = session.query(Contact).count() # my guess is here
allcountlbl = ttk.Label(self.frame1, text=total)
allcountlbl.grid(column=7, row=4)
if not self.username.get():
username = ''
else:
username = self.username.get()
# if isinstance(username, StringVar):
# username = ""
if not self.folder.get():
folder = self.folder
else:
folder = self.folder.get()
print type(username)
addrlbl = ttk.Label(self.frame1, text=username)
addrlbl.grid(column=2, row=4)
dirlbl = ttk.Label(self.frame1, text=folder)
dirlbl.grid(column=4, row=4, sticky=W)
self.frame1.after(1000, self.update_lbl)
def statusUI(self):
workinglbl = ttk.Label(self.frame1, text="Working on:")
workinglbl.grid(column=1, row=4)
self.update_lbl()
boxlbl = ttk.Label(self.frame1, text="Folder:")
boxlbl.grid(column=3, row=4)
def initUI(self):
# First page design tab/frame f1
self.serverUI()
self.mailUI()
self.startUI()
self.statusUI()
修改
这是调用setup_db时发生的情况。
我不确定sqlalchemy
是否处理连接关闭,因为我可以执行session.close()
或engine.dispose()
def setup_db():
engine = create_engine('sqlite:///records.db')
Base.metadata.bind = engine
DBSession = sessionmaker(bind=engine)
session = DBSession()
return session
答案 0 :(得分:1)
虽然可能不是导致问题的唯一原因,但是你有各种各样的内存泄漏。每秒你都会创建三个新标签。这意味着只需10分钟就可以创建1,800个标签小部件。虽然我认为tkinter可以处理几千个小部件,但是你每小时创造的数量超过10,000个。
您应该只创建一次标签,然后仅在每秒调用的函数中更改其text属性。
您可能也应该将session = setup_db()
移出循环。我怀疑有必要每秒创建一个新的会话。创建一个整个程序生命周期的会话。