2013-08-23 269 views
0

我在這段代碼中遇到了麻煩,它不會在某個點執行代碼。我無法用措辭來描述問題,但在代碼中,window.mainloop()下的其餘代碼將不會按需運行,除非主窗口(gui)已關閉,這是有問題的。當def計算下的所有代碼已經完全執行時,我希望能夠print(t.test)。我在技術上可以通過刪除window.mainloop()來做到這一點,但是在我能夠收集至關重要的輸入之前,這將運行代碼。我需要保持編碼的結構如下所示。tkinter順序執行順序

import tkinter 

class Test: 

    def __init__(self): 
    self.test = False 

def calculate(window, userinput, t): 
    test = userinput.get() 
    print(test) 
    window.destroy() 
    t.test = True 

def main(): 

    t = Test() 
    gui = tkinter.Tk() 
    gui.title("example window") 
    gui.geometry("400x400") 

    userinput = tkinter.StringVar() 

    window = tkinter.Toplevel() 
    window.title("Entry") 
    tkinter.Message(window, text="Label", width="200").pack() 
    tkinter.Entry(window, width=30, textvariable=userinput).pack() 
    tkinter.Button(window, text="ok", command=lambda: calculate(window, userinput, t)).pack() 
    window.mainloop() 

    print(t.test) 

    gui.mainloop() 

main() 

編輯: 看來我是能夠使它的行爲方式相同,並通過把print(t.test)了自己定義的功能下,然後調用它def calculate(userinput, window, t)下,在最後一行保持相同的結構。我測試了這個,但它導致主窗口凍結。

回答

0

Tkinter的是設計工作的方式是你:

  1. 創建你的部件
  2. 調用主循環(僅一次)
  3. 窗戶被破壞,程序退出

您不應該多次調用mainloop,並且在調用mainloop之後不應該有更多的代碼。

如果你想要的東西后調用運行主循環,與after安排它:主循環開始後

... 
gui.after(1, do_something) 
gui.mainloop() 

任何由after計劃運行。