2016-05-14 142 views
-1

我試圖循環這個,但每次都失敗。 這是我試圖循環的def create_widgets。所以我有一個圖形用戶界面,只要有東西脫機,就會顯示一個紅色的按鈕/框。如何循環此代碼?

這是我嘗試使用的代碼。

from tkinter import * 

class Application(Frame): 
""" GUI """ 

def __init__(self, master): 
    """ Initialize the Frame""" 
    Frame.__init__(self,master) 
    self.grid() 
    self.create_widgets() 

def create_widgets(self): 
    """Create button. """ 
    import os 
    #Router 
    self.button1 = Button(self) 
    self.button1["text"] = "Router" 
    self.button1["fg"] = "white" 
    self.button1.grid(padx=0,pady=5) 
    #Ping 
    hostname = "10.18.18.1" 
    response = os.system("ping -n 1 " + hostname) 
    #response 
    if response == 0: 
     self.button1["bg"] = "green" 
    else: 
     self.button1["bg"] = "red" 

root = Tk() 
root.title("monitor") 
root.geometry("500x500") 

app = Application(root) 

root.mainloop() 
+0

你想整函數循環的第一次執行? –

+0

在不相關的說明中,您通常不希望導入模塊,而只是程序的開始。 –

+0

我的回答有幫助嗎?如果沒有,請告訴我,以便我可以編輯它。 –

回答

2

您可以將它放到小號after方法Tk「使用Tk的活動中循環」。

def if_offline(self): 
    #Ping 
    hostname = "10.18.18.1" 
    response = os.system("ping -n 1 " + hostname) 
    #response 
    if response == 0: 
     self.button1["bg"] = "green" 
    else: 
     self.button1["bg"] = "red" 

然後,該線去任何地方app = Application(root)root.mainloop()之間:

root.after(0, app.if_offline) 

after附加一個過程到Tk事件循環。第一個參數是過程應該以毫秒爲單位重複的次數,第二個參數是要執行的函數對象。由於我們指定的時間是0,它會不斷檢查並不斷更新按鈕的背景顏色。如果這會攪動你的CPU,或者你不想那麼多,你可以將重複時間改變成更大的。

傳入的函數對象應該只是:函數對象。它具有與構造函數Button中的命令參數相同的規則。 如果您需要在參數傳遞給函數,使用lambda像這樣:

root.after(0, lambda: function(argument)) 

這工作,因爲lambda函數返回一個函數對象,被執行時將運行function(argument)

Source

+0

嗨 我是新來編程,所以我不明白爲什麼我寫這個錯誤。 NameError:名稱'root'未定義 root.after(0,if_offline) root.mainloop() – user6335058

+0

嘗試向類中的所有內容添加一個縮進。 –

+0

我的錯誤。它需要'app.if_offline'而不是'if_offline'。我編輯了包含該答案的答案。 –