在GUI中运行sql查询时,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()

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

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

对于tkinter绘制任何东西,它必须在主循环中。主循环顾名思义就是处理事件的无限循环。因此,在主循环完成之前,主循环之后的命令不会执行。

要解决您的问题,您需要将SQL查询设置为在GUI更新时在主循环中执行。通过设置一个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在尝试连接时更新)

相关内容

  • 没有找到相关文章

最新更新