我有一个tkinter GUI,允许用户在sqlite数据库上执行搜索。数据库不是静态的,因此不知道每次搜索需要多长时间。应用程序是单线程的(我想保持这种方式)。因此,我想要一个进度条(或动画的东西)来重新向用户保证搜索正在进行时发生了什么。乍一看ttk.ProgressBar
似乎可以通过indeterminate
模式执行此操作,但它似乎无法在TkDocs.中详细说明
对于不确定的进展,TkDocs声明......
...在操作开始时,您只需调用进度条的“开始”方法,在操作结束时,您将调用其“停止”方法。进度条将负责其余部分。
......但似乎并非如此。如果我在执行sqlite查询之前只使用.start()
,并且在完成后使用.stop()
,则会出现进度条,但根本不会生成动画。
如果我在for
循环中执行sqlite select语句并包含prog.step()
和prog.update_idletasks()
,我可以强制它更新。但这会影响性能,只有在循环为for row in select_statement:
时返回多行时才能正常工作。
那么如何在不使用step
和update_idletask
强制执
代码。这不起作用......
prog = ttk.ProgressBar(root,mode='indeterminate')
...
prog.start()
result = None
try:
conn = sqlite3.connect(database)
result = conn.execute('select * from table where a=? and b=?',(var1,var2))
result = result.fetchall()
conn.close()
except:
handle the exception
prog.stop()
Works-ish,但是很hacky。
prog = ttk.ProgressBar(root,mode='indeterminate')
...
prog.start()
result = None
try:
for row in conn.execute('select * from table where a=? and b=?',(var1,var2)):
result.append(row)
prog.step()
prog.update_idletasks()
conn.close()
except:
handle the exception
prog.stop()
答案 0 :(得分:1)
因此,采用第二个工作代码块并重构进度条更新可以清除内容。
prog = ttk.ProgressBar(root,mode='indeterminate')
...
prog.start()
def progress():
prog.step()
prog.update_idletasks()
with sqlite3.connect(database) as conn:
conn.set_progress_handler(handler=progress, n=1)
database_query = conn.execute('select * from table where a=? and b=?',(var1,var2))
result = database_query.fetchall()