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

时间:2016-06-24 14:16:48

标签: python python-2.7 user-interface tkinter ttk

我正在构建一个GUI,在某些时候它将查询SQL数据库。在查询运行的同时,我想向用户显示一个不确定的进度条(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()

不幸的是,查询似乎甚至在加载根窗口之前就已经运行了。

如何显示正在执行查询的移动进度条 WHILST

任何反馈都将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

要解决您的问题,您需要在GUI更新时将SQL查询设置为在mainloop中进行。通过设置after调用来实现这一点 - 它可能是一个lambda,所以这是交换到类的好时机,因为它们允许你从after调用一个方法,并且该方法可以设置一个类变量

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更新 - 将其投入线程或工作池,因为GUI在python执行函数时无法更新(除非在执行期间有显式调用) ,但SolvittConnect在尝试连接时没有明确告诉GUI更新)