我想在网络中每隔一秒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?取得)如果有人知道答案......
感谢您的帮助
答案 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()