【问题标题】:Ping every second and Tkinter Button每秒 Ping 和 Tkinter 按钮
【发布时间】:2015-10-06 21:49:47
【问题描述】:

我想在我的网络中每秒 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() 

它不起作用,我不知道为什么。一开始这是一个“自我”问题,但现在它似乎与我每秒 ping 的方式有关(我从那里得到它 What is the best way to repeatedly execute a function every x seconds in Python?)如果有人知道答案......

感谢您的帮助

【问题讨论】:

  • 变量button 被引用时超出范围。相关:stackoverflow.com/questions/291978/…
  • 你的意思是说self.button(注意你甚至错过了ping上的适当参数)?函数中的局部变量无法从外部访问,故意

标签: python loops tkinter


【解决方案1】:

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

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

您需要做的就是移除对睡眠的调用,并添加对after 的调用。一旦你这样做了,删除你的while循环,并调用这个函数一次。然后,Tkinter 将每秒(大约)调用一次此函数

看起来像这样:

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

它看起来有点像递归,但事实并非如此。您只是在 Tkinter 管理的事件队列中添加一个事件。时机成熟时,它将项目从队列中拉出并执行。

【讨论】:

  • 我是 Python 初学者。你能给我写一个你描述的小例子吗?那样我就不会犯错并且更好地理解该方法。谢谢:D
【解决方案2】:

非常感谢大家!现在可以了:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 2013-07-15
  • 2018-08-15
  • 2021-04-14
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多