不确定ttk进度条除非被强制,否则不会更新

时间:2015-01-22 07:30:22

标签: python python-3.x tkinter ttk

我有一个tkinter GUI,允许用户在sqlite数据库上执行搜索。数据库不是静态的,因此不知道每次搜索需要多长时间。应用程序是单线程的(我想保持这种方式)。因此,我想要一个进度条(或动画的东西)来重新向用户保证搜索正在进行时发生了什么。乍一看ttk.ProgressBar似乎可以通过indeterminate模式执行此操作,但它似乎无法在TkDocs.中详细说明

对于不确定的进展,TkDocs声明......

  

...在操作开始时,您只需调用进度条的“开始”方法,在操作结束时,您将调用其“停止”方法。进度条将负责其余部分。

......但似乎并非如此。如果我在执行sqlite查询之前只使用.start(),并且在完成后使用.stop(),则会出现进度条,但根本不会生成动画。

如果我在for循环中执行sqlite select语句并包含prog.step()prog.update_idletasks(),我可以强制它更新。但这会影响性能,只有在循环为for row in select_statement:时返回多行时才能正常工作。

那么如何在不使用stepupdate_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()

1 个答案:

答案 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()