如何循环此代码?

时间:2016-05-14 18:34:51

标签: python-3.x tkinter

我试图循环这个但每次都失败了。 这是我尝试循环的def create_widgets。所以我得到一个GUI,当一些东西离线时会显示一个红色的按钮/框。

这是我尝试使用的代码。

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()

1 个答案:

答案 0 :(得分:2)

您可以使用Tk的{​​{1}}方法将其附加到Tk的事件循环中。

after

然后,此行位于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事件循环上。第一个参数是进程应该以毫秒为单位重复的频率,第二个参数是要执行的函数对象。由于我们指定的时间是0,它将不断检查并不断更新按钮的背景颜色。如果这会搅乱你的CPU,或者你不想那么多ping,你可以将重复时间改为更大的。

传入的函数对象应该只是:一个函数对象。它与Tk构造函数中的命令参数具有相同的规则。 如果需要将参数传递给函数,请使用如下的lambda:

Button

这是有效的,因为lambda函数返回一个函数对象,执行时将运行root.after(0, lambda: function(argument))

Source