我正在构建一个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在尝试连接时更新)