2013-07-26 19 views
1

我正在運行使用由我的腳本放在一起的LaTeX構建一組PDF的慢速過程。Tkinter盒子包裝在循環中很慢

這些PDF內置在for循環中。我想要顯示一個狀態窗口,爲每個學生添加一行循環,以便您可以看到進度。我一直在用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窗口本身一起)。

任何想法是什麼導致延遲顯示?

謝謝!

+0

嘗試在每行插入後調用'Rebox2.w.update_idletasks()'。更新顯示的某些任務(如調整大小和重繪窗口小部件)被稱爲空閒任務,因爲它們通常被延遲到應用程序處理事件完成。這會迫使應用程序在正常應用程序空閒之前發生。如果你還在循環之前調用它,它應該使ReBox2窗口本身更快顯示。 – martineau

+0

@martineau感謝您的建議。它不喜歡.w.update;它是一個多列表框,而不是標準列表框,所以這可能是問題所在。我拿出了.w,它跑了,但沒有更新更快。 – DeltaG

+0

這是一個錯字,對不起。應該是'Rebox2.update_idletasks()' - 即沒有'.w'。 – martineau

回答

1

是的,據我所知,有兩個問題。首先,您沒有更新每個新條目的顯示。其次,你沒有使用按鈕觸發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() 
+0

整個事情真的是由一個按鈕觸發的;所有這些都在一個按鈕所調用的函數內,並且該按鈕按下時會生成該MLB。長話短說,儘管...'.update()'做到了 - 它的工作原理就是我一直想要的 - 謝謝! – DeltaG