不断使用 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
,它运行 doPing
。 doPing
调用 ping
,更新 current_value
,然后等待 500 毫秒,然后再次调用自身。然后在主线程中 testing
使用 current_value
的值每 500 毫秒更新一次标签。当 window 关闭并且 root.mainloop
完成时 continue_thread
设置为 false,然后调用 sys.exit
,停止线程。
有 2 个全局变量 current_value
和 continue_thread
。第一个允许您访问 testing
中 ping
的 return 值,第二个允许主线程告诉 ping 线程在 Tkinter window 关闭时停止。全局变量不是好的编程习惯,我建议改用 类。为了简单起见,我在这里使用了它们。
我正在尝试使用 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
,它运行 doPing
。 doPing
调用 ping
,更新 current_value
,然后等待 500 毫秒,然后再次调用自身。然后在主线程中 testing
使用 current_value
的值每 500 毫秒更新一次标签。当 window 关闭并且 root.mainloop
完成时 continue_thread
设置为 false,然后调用 sys.exit
,停止线程。
有 2 个全局变量 current_value
和 continue_thread
。第一个允许您访问 testing
中 ping
的 return 值,第二个允许主线程告诉 ping 线程在 Tkinter window 关闭时停止。全局变量不是好的编程习惯,我建议改用 类。为了简单起见,我在这里使用了它们。