我试图循环这个但每次都失败了。 这是我尝试循环的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()
答案 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))
。