不断使用 Ping 验证连接并在 python tkinter 上显示反馈

Using Ping constantly to verify connection and display feedback on python tkinter

我正在尝试使用 python tkinter 制作一个小应用程序。 其中我需要一个 ping 命令来不断检查与某个设备示例“192.168.1.21”的连接,并告诉我该设备是否已实时连接。 注意:我正在使用 ping3 这是我的程序:

root = Tk()
root.geometry("400x400")
label_1 = Label(root, text = "Not connected")
label_1.pack()




def testing(label):
    if ping('192.168.1.21', timeout=0.5) != None: #To test the connection 1 time
        label.config(text = "Connected")
    else:
        label.config(text = "Not Connected")

    label.after(500, lambda : testing(label_1))

def popup(): #A popup that does the same thing
    top = Toplevel(root)
    top.geometry("150x150")
    label_2 = Label(top, text = "Not connected")
    label_2.pack()
    label_2.after(500, lambda : testing(label_2))
    top.mainloop()

btn = Button(root, text = "Popup", command=popup)
btn.pack()

testing(label_1)

root.mainloop()

我怎样才能让它不冻结并继续测试,同时让程序的其余部分 运行 顺利进行。 谢谢你,如果我在代码中犯了错误,我很抱歉,我对 python in generale 还是个新手。

您可以使用线程来实现这一点。这允许 tkinter 主循环和 ping 同时发生,这意味着 GUI 不会冻结。

import threading, time, sys

root = Tk()
root.geometry("400x400")
label_1 = Label(root, text = "Not connected")
label_1.pack()


current_value = None
continue_thread = True

def doPing():
    global current_value, continue_thread
    while continue_thread:
        current_value = ping('192.168.1.21', timeout=0.5)
        time.sleep(0.5) # 500ms delay before pinging again
    sys.exit() # Stop thread when window is closed


def testing(label):
    global current_value
    if current_value != None: #To test the connection 1 time
        label.config(text = "Connected")
    else:
        label.config(text = "Not Connected")

    label.after(500, lambda : testing(label))

def popup(): #A popup that does the same thing
    top = Toplevel(root)
    top.geometry("150x150")
    label_2 = Label(top, text = "Not connected")
    label_2.pack()
    label_2.after(500, lambda : testing(label_2))
    top.mainloop()

btn = Button(root, text = "Popup", command=popup)
btn.pack()

ping_thread = threading.Thread(target = doPing)
ping_thread.start()
testing(label_1)

root.mainloop()
continue_thread = False # end thread after window is closed

程序现在使用线程 ping_thread,它运行 doPingdoPing 调用 ping,更新 current_value,然后等待 500 毫秒,然后再次调用自身。然后在主线程中 testing 使用 current_value 的值每 500 毫秒更新一次标签。当 window 关闭并且 root.mainloop 完成时 continue_thread 设置为 false,然后调用 sys.exit,停止线程。

有 2 个全局变量 current_valuecontinue_thread。第一个允许您访问 testingping 的 return 值,第二个允许主线程告诉 ping 线程在 Tkinter window 关闭时停止。全局变量不是好的编程习惯,我建议改用 类。为了简单起见,我在这里使用了它们。