ttk 进度条在 GUI 中 运行 sql 查询时停止

ttk progress bar stops whilst running sql query within GUI

我正在构建一个 GUI,它会在某些时候查询 SQL 数据库。虽然查询是 运行ning,但我想向用户显示一个不确定的进度条 (ttk) 来指示这一点。请参阅下面的简单示例。

from Function_Sheet import *
from Tkinter import *
import ttk
root = Tk()

s = ttk.Style()
s.theme_use('clam')
s.configure('red.Horizontal.TProgressbar', foreground='red', background='red')
mpb2 = ttk.Progressbar(root,style='red.Horizontal.TProgressbar', orient ='horizontal', length = 200, mode ='indeterminate')
mpb2.pack()
mpb2.start(1)
print 'query not done'
cursor = SolvittConnect(<SQL HERE>)
print 'query done'
root.mainloop()

不幸的是,查询似乎 运行 甚至在加载根 window 之前。

如何在执行查询时显示移动进度条

如有任何反馈,我们将不胜感激。

tkinter绘制任何东西,它必须在主循环中。 mainloop 就像它听起来的那样——一个处理事件的无限循环。因此,在主循环完成之前,主循环之后的命令不会执行。

要解决您的问题,您需要将 SQL 查询设置为在 GUI 更新时在主循环中发生。通过设置一个 after 调用来做到这一点——它可能是一个 lambda,所以现在是切换到 classes 的好时机,因为它们允许你从一个 after 和那个方法调用一个方法可以设置一个class变量

class ...
    ...
    def __init__(self):
        root=Tk()
        ...
        mpb2.start(1)
        root.after(1000, # in milliseconds
                   lambda *e: self.connect())   
        root.mainloop()
        ...
    def connect(self):
        print "querying"
        self.cursor = SolvittConnect(<SQL>)
        print "query complete"

请注意,您的 SolvittConnect 可能会阻止 GUI 更新 - 考虑将其扔给线程或工作池,因为在 python 执行函数时 GUI 无法更新(除非有在执行期间显式调用,但 SolvittConnect 在尝试连接时没有明确告诉 GUI 更新)