Python 回路中的接线盒填料速度缓慢
我正在运行一个缓慢的过程,用我的脚本编写的LaTeX构建一组PDF PDF内置在for循环中。我想显示一个状态窗口,为循环经过的每个学生添加一行,以便您可以看到进度。我一直在用Python 回路中的接线盒填料速度缓慢,python,tkinter,Python,Tkinter,我正在运行一个缓慢的过程,用我的脚本编写的LaTeX构建一组PDF PDF内置在for循环中。我想显示一个状态窗口,为循环经过的每个学生添加一行,以便您可以看到进度。我一直在用print来实现这一点,但我想要的是与我移动到的Tkinter接口很好地集成的东西 我有这个: ReStatuswin = Toplevel(takefocus=True) ReStatuswin.geometry('800x300') ReStatuswin.title("Creating Reassessments..
print
来实现这一点,但我想要的是与我移动到的Tkinter接口很好地集成的东西
我有这个:
ReStatuswin = Toplevel(takefocus=True)
ReStatuswin.geometry('800x300')
ReStatuswin.title("Creating Reassessments...")
Rebox2 = MultiListbox(ReStatuswin, (("Student", 15), ("Standard", 25), ("Problems", 25) ))
Rebox2.pack(side = TOP)
OKR = Button(ReStatuswin, text='OK', command=lambda:ReStatuswin.destroy())
OKR.pack(side = BOTTOM)
然后循环:
for row in todaylist:
然后,在循环内部,PDF制作完成后
Rebox2.insert(END, listy)
它可以很好地插入行,但只有在整个循环完成后,它们才会显示(以及ReBox2窗口本身)
你知道是什么导致了显示延迟吗
谢谢 是的,据我所知,有两个问题。首先,您没有使用每个新条目更新显示。其次,您不是用按钮触发for循环,而是让它在启动时运行(这意味着直到循环退出后才会创建显示)。然而,不幸的是,我不能真正使用您提供的代码,因为它是一个更大的东西的片段。但是,我制作了一个小脚本,它应该演示如何做您想做的事情:
from Tkinter import Button, END, Listbox, Tk
from time import sleep
root = Tk()
# My version of Tkinter doesn't have a MultiListbox
# So, I use its closest alternative, a regular Listbox
listbox = Listbox(root)
listbox.pack()
def start():
"""This is where your loop would go"""
for i in xrange(100):
# The sleeping here represents a time consuming process
# such as making a PDF
sleep(2)
listbox.insert(END, i)
# You must update the listbox after each entry
listbox.update()
# You must create a button to call a function that will start the loop
# Otherwise, the display won't appear until after the loop exits
Button(root, text="Start", command=start).pack()
root.mainloop()
是的,据我所知,有两个问题。首先,您没有使用每个新条目更新显示。其次,您不是用按钮触发for循环,而是让它在启动时运行(这意味着直到循环退出后才会创建显示)。然而,不幸的是,我不能真正使用您提供的代码,因为它是一个更大的东西的片段。但是,我制作了一个小脚本,它应该演示如何做您想做的事情:
from Tkinter import Button, END, Listbox, Tk
from time import sleep
root = Tk()
# My version of Tkinter doesn't have a MultiListbox
# So, I use its closest alternative, a regular Listbox
listbox = Listbox(root)
listbox.pack()
def start():
"""This is where your loop would go"""
for i in xrange(100):
# The sleeping here represents a time consuming process
# such as making a PDF
sleep(2)
listbox.insert(END, i)
# You must update the listbox after each entry
listbox.update()
# You must create a button to call a function that will start the loop
# Otherwise, the display won't appear until after the loop exits
Button(root, text="Start", command=start).pack()
root.mainloop()
尝试在每次插入行后调用Rebox2.w.update\u idletasks()。更新显示中的某些任务(如调整窗口小部件的大小和重画窗口小部件)称为空闲任务,因为它们通常被推迟到应用程序处理完事件之后。这将强制在应用程序正常空闲之前发生。如果您在循环之前调用它,它应该会使ReBox2窗口本身更快地出现。@martineau感谢您的建议。它不喜欢.w.update;它是一个多列表框,而不是标准的列表框,所以这可能是问题所在。我拿出了.w,它运行了,但没有更新得更快。对不起,这是个打字错误。本应是
Rebox2.update_idletasks()
——即没有.w
。尝试在每次插入行后调用Rebox2.w.update_idletasks()
。更新显示中的某些任务(如调整窗口小部件的大小和重画窗口小部件)称为空闲任务,因为它们通常被推迟到应用程序处理完事件之后。这将强制在应用程序正常空闲之前发生。如果您在循环之前调用它,它应该会使ReBox2窗口本身更快地出现。@martineau感谢您的建议。它不喜欢.w.update;它是一个多列表框,而不是标准的列表框,所以这可能是问题所在。我拿出了.w,它运行了,但没有更新得更快。对不起,这是个打字错误。本来应该是Rebox2.update_idletasks()
——也就是说,没有.w
。整个过程实际上是由一个按钮触发的;所有这些都在一个按钮调用的函数中,这个MLB是在按下按钮时生成的。长话短说,不过.update()
做到了-它的工作方式正是我一直想要的-谢谢!整个过程实际上是由一个按钮触发的;所有这些都在一个按钮调用的函数中,这个MLB是在按下按钮时生成的。长话短说,不过.update()
做到了-它的工作方式正是我一直想要的-谢谢!