我正在创建一个脚本来判断我的一些计算机的状态,但注意到随着时间的推移,Tkinter窗口正在积累越来越多的资源.有什么办法可以解决这个问题吗?
import subprocess
import time
import tkinter as tk
import threading
import gc
ip_addresses = ["192.168.1.83", "192.168.1.93", "192.168.1.93", "192.168.1.92", "192.168.1.95", "192.168.1.103", "192.168.1.105"]
i= 0
if i == 0:
root = tk.Tk()
root.title("Online")
root.geometry("500x300")
i+1
label_texts = [f"{ip_address} -> unknown" for ip_address in ip_addresses]
labels = [tk.Label(root, text=label_text, font=("Arial", 16), fg="#FF0000") for label_text in label_texts]
for i, label in enumerate(labels):
label.pack(padx=10, pady=5)
def check_ip_status(ip_address, label):
try:
subprocess.check_output(f"ping {ip_address} -n 1", shell=True, timeout=5)
label.config(text=f"{ip_address} -> online", fg="#00FF00") # Green
except subprocess.CalledProcessError:
label.config(text=f"{ip_address} -> offline", fg="#FF0000") # Red
except subprocess.TimeoutExpired:
label.config(text=f"{ip_address} -> offline (timeout)", fg="#FFA500") # Orange
def check_all_ip_statuses():
processes = []
for i, ip_address in enumerate(ip_addresses):
label = labels[i]
process = subprocess.Popen(f"ping {ip_address} -t", shell=True, stdout=subprocess.DEVNULL)
processes.append(process)
thread = threading.Thread(target=check_ip_status, args=(ip_address, label))
thread.start()
root.after(5000, check_all_ip_statuses)
gc.collect()
# Close all subprocesses
for process in processes:
process.kill()
process.communicate()
check_all_ip_statuses()
root.mainloop()
我试图强迫垃圾收集器,终止所有进程,并偶尔清除标签,但没有什么能阻止他们囤积越来越多的内存
-------------Update---------
我已将子流程调用更改为pythonping
import pythonping
import time
import tkinter as tk
import threading
import gc
ip_addresses = ["192.168.1.83", "192.168.1.85", "192.168.1.93", "192.168.1.92", "192.168.1.95", "192.168.1.103", "192.168.1.105"]
i= 0
if i == 0:
root = tk.Tk()
root.title("Online")
root.geometry("500x300")
i+1
def create_labels():
global labels
labels = [tk.Label(root, text=f"{ip_address} -> unknown", font=("Arial", 16), fg="#FF0000") for ip_address in ip_addresses]
for label in labels:
label.pack(padx=10, pady=5)
def check_ip_status(ip_address, label):
response = pythonping.ping(ip_address, count=1, timeout=5)
if response.success():
label.config(text=f"{ip_address} -> online", fg="#00FF00") # Green
else:
label.config(text=f"{ip_address} -> offline", fg="#FF0000") # Red
def check_all_ip_statuses():
for i, ip_address in enumerate(ip_addresses):
label = labels[i]
thread = threading.Thread(target=check_ip_status, args=(ip_address, label))
thread.start()
gc.collect()
root.after(1000, check_all_ip_statuses)
create_labels()
check_all_ip_statuses()
root.mainloop()