我正在构建一个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 ?
任何反馈都将不胜感激。
答案 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更新)