Ping每秒和Tkinter Button

时间:2015-10-06 21:49:47

标签: python loops tkinter

我想在网络中每隔一秒ping一个主机名并更改相应按钮的名称。 现在我有这个:

import tkinter as tk
import time

# variables
hostname = ("ASUS-PC")
mot= "inactif"

class test(tk.Tk):
    # make buttons on grid
    def __init__(self):
        tk.Tk.__init__(self)

        self.button = list()
        for i in range(10):
            i=i+1
            RN = ('RN '+str(i))
            self.button.append(tk.Button(text=RN))
            self.button[-1].grid(row=0,column=i)
    # ping hostname every second
    def ping(self):
        import subprocess
        import os
        result=subprocess.Popen(["ping", "-n", "1", "-w", "200", hostname],shell=True).wait()
        if result == 0:
            print (hostname, "active")
        else:
            B = self.button[0] 
            B ['text'] = mot

        time.sleep(1)
    while True:
        ping()

app = test ()
app.mainloop() 

它没有用,我不知道为什么。一开始它是一个" self"问题,但现在它似乎与我每秒如何ping(我从那里What is the best way to repeatedly execute a function every x seconds in Python?取得)如果有人知道答案......

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

您的代码"无法正常工作的原因"是你有一个无限循环调用sleep。这可以防止事件循环处理任何事件,包括告诉Tkinter刷新显示的事件。您的程序实际上正在运行,您无法看到任何结果。

解决方案是使用after每秒调用一次您的函数。在这些调用之间,tkinter将有时间更新显示,而无需进行任何额外的工作。

您需要做的就是取消对睡眠的呼叫,并添加对after的呼叫。完成后,删除while循环,并调用此函数一次。然后,Tkinter将每秒(大约)调用此函数一次

它看起来像这样:

def ping(self):
    <all your other code>
    self.after(1000, self.ping)

看起来有点像递归,但事实并非如此。您只需在Tkinter管理的事件队列中添加事件即可。到时候,它会将项目从队列中拉出并执行它。

答案 1 :(得分:0)

非常感谢大家!现在它起作用了:

...
    # ping hostname every second
    def ping(self):
        import subprocess
        import os
        result=subprocess.Popen(["ping", "-n", "1", "-w", "200", hostname],shell=True).wait()
        if result == 0:
            print (hostname, "active")
        else:
            print (hostname, "inactive")
            B = self.button[0] 
            B ['text'] = mot

        self.after(1000, self.ping)

app = test ()
app.ping()
app.mainloop()