I am using the after method of ttk
(tkinter
) to update/create some labels in realtime. I have adapted my code from this SO question but i noticed after a while the screen stops responding. I am not sure how long but when I launch the program everything seems to work fine. When I slept off without closing the UI, on return it freezes and unfreezes after few seconds allowing me to interact a few seconds before freezing.
I am unaware of what causes this behaviour but my suspicion is where i make sqlite query to display total records in database. Or maybe I am doing too much label update in one function. Please see update_lbl
method below.
For preview of what am trying to achieve see the 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()
Edit:
This is what happens when setup_db is called.
Am not sure here if sqlalchemy
handles connection closing as there are different variation i could do session.close()
or engine.dispose()
def setup_db():
engine = create_engine('sqlite:///records.db')
Base.metadata.bind = engine
DBSession = sessionmaker(bind=engine)
session = DBSession()
return session