2015-05-14 77 views
3

在下面的Python應用程序中,我的主要基於Tkinter的GUI窗口具有一些按鈕(這又調用了一些函數)和文本窗口小部件。文本小部件將通過按下按鈕調用的函數進行更新。將窗口小部件的引用傳遞給一個函數

我試着發送文本到函數,但我不能在順序順序中看到文本中的更新值。而是首先完成函數(或循環),然後在最後它將所有值一起更新。我想在執行相應的指令時逐個看到它們。

from Tkinter import * 
import Tkinter as tk 
from functools import partial 
import time 

class mainWindow: 
    def __init__(self, master): 
     self.master = master 
     self.frame = tk.Frame(self.master) 

     self.stat0 = tk.Text(self.frame,bg='cyan', font=("Helvetica", 10), width = 8, height = 1) 
     self.stat0.grid(row=2, column=0, sticky=W)  
     self.b0 = tk.Button(self.frame,bg='black',fg='white',text='LOAD',font=("Helvetica", 8),command=lambda:self.loadStatus(self.stat0)) 
     self.b0.grid(row = 1, column = 0, sticky=W) 

     self.frame.grid() 


    def loadStatus(self,stat): 
     stat.insert(END,5) 
     time.sleep(1) 
    # stat.delete(1.0,END) 
     stat.insert(END,"hi") 
    # stat.delete(1.0,END) 
     time.sleep(1) 
     stat.insert(END,0) 

if __name__ == '__main__': 
    #main() 
    root = tk.Tk() 
    app = mainWindow(root) 
    root.mainloop() 

在這裏,按下按鈕load,我可以看到的函數完成後,並插入的延遲之後一氣呵成(即順序分配)的所有值。

請按照執行的指令逐個更新文本條目。

回答

1

您應該使用after在tkinter中執行一些時間觸發的事件。我改變你的代碼使用它:

from Tkinter import * 
import Tkinter as tk 
from functools import partial 

class mainWindow: 
    def __init__(self, master): 
     self.master = master 
     self.frame = tk.Frame(self.master) 

     self.stat0 = tk.Text(self.frame,bg='cyan', 
          font=("Helvetica", 10), width = 8, height = 1) 
     self.stat0.grid(row=2, column=0, sticky=W) 
     self.b0 = tk.Button(self.frame,bg='black',fg='white',text='LOAD', 
          font=("Helvetica", 8),command=self.loadStatus) 
     self.b0.grid(row = 1, column = 0, sticky=W) 

     self.frame.grid() 


    def loadStatus(self): 

     self.stat0.insert(END, "hi") 
     self.frame.after(1000, self.loadStatus) 



if __name__ == '__main__': 
    #main() 
    root = tk.Tk() 
    app = mainWindow(root) 
    root.mainloop() 

的想法是,loadStatusafter稱爲「遞歸」。現在它永遠有效,但你可以添加一些計數器等來檢查遞歸調用何時應該停止。希望這可以幫助。

+0

這不是我想要的。以上只是一個虛擬代碼。我的應用程序實際上想要讀取函數內的循環變量的值並更新其文本小部件。所有這些都應該發生在單個函數調用中的不同循環迭代中。所以,根據我的代碼: 'def loadStatus(self,stat): stat.insert(END,5) time.sleep(1) stat.insert(END,「hi」) time.sleep(1 ) stat.insert(END,0)' 我希望看到這些值在按下按鈕時發生變化並穩定在0。在您的更改中,按一下按鈕將會一次又一次地調用func,這是不需要的。 –

相關問題