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 更新)
我正在构建一个 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 更新)