Я попытался с помощью индикатора выполнения указать, как повышается или понижается скорость Wi-Fi. Их 3, один для загрузки, другой для выгрузки и последний для пинга, хотя последний не нужен, но идея в том, что полоска работает в то время, когда рассчитывается скорость Wi-Fi
Код: Выделить всё
import tkinter as tk
from tkinter import ttk
import threading
from datetime import datetime
import speedtest
class ProgressWindow:
def __init__(self):
self.root = tk.Toplevel()
self.root.title("Progreso")
self.root.geometry("300x100")
self.status_label = ttk.Label(self.root, text="Espere, se está calculando...", font=("Helvetica", 12))
self.status_label.pack(pady=20)
def update_status(self, status):
self.status_label.config(text=status)
self.root.update()
def close(self):
self.root.destroy()
class SpeedTestApp:
def __init__(self, root):
self.root = root
self.root.title("SpeedTest App")
self.root.geometry("400x350")
# Variables para los resultados
self.ping_var = tk.StringVar()
self.download_var = tk.DoubleVar() # Usamos DoubleVar para valores decimales
self.upload_var = tk.DoubleVar() # Usamos DoubleVar para valores decimales
self.status_var = tk.StringVar()
# Estado inicial del botón
self.button_state = 'normal'
# Crear la interfaz
self.create_widgets()
def create_widgets(self):
# Título
title_label = ttk.Label(self.root, text="SpeedTest", font=("Helvetica", 16))
title_label.pack(pady=10)
# Botón de inicio
self.start_button = ttk.Button(self.root, text="Start", command=self.start_speedtest)
self.start_button.pack(pady=10)
# Etiquetas y velocímetros de Descarga
download_label = ttk.Label(self.root, text="Velocidad de Descarga (Mbps)")
download_label.pack()
self.download_value_label = ttk.Label(self.root, textvariable=self.download_var)
self.download_value_label.pack()
self.download_progressbar = ttk.Progressbar(self.root, length=200, mode="determinate", variable=self.download_var)
self.download_progressbar.pack(pady=5)
# Etiquetas y velocímetros de Subida
upload_label = ttk.Label(self.root, text="Velocidad de Subida (Mbps)")
upload_label.pack()
self.upload_value_label = ttk.Label(self.root, textvariable=self.upload_var)
self.upload_value_label.pack()
self.upload_progressbar = ttk.Progressbar(self.root, length=200, mode="determinate", variable=self.upload_var)
self.upload_progressbar.pack(pady=5)
# Etiqueta y campo de Ping
ping_label = ttk.Label(self.root, text="Ping (ms)")
ping_label.pack()
self.ping_value_label = ttk.Label(self.root, textvariable=self.ping_var)
self.ping_value_label.pack(pady=5)
self.ping_progressbar = ttk.Progressbar(self.root, length=200, mode="determinate", variable=self.ping_var)
self.ping_progressbar.pack(pady=5)
# Mensaje de estado
self.status_label = ttk.Label(self.root, textvariable=self.status_var, font=("Helvetica", 12))
self.status_label.pack(pady=10)
def start_speedtest(self):
# Deshabilitar el botón de inicio mientras se realiza la prueba
self.start_button.config(state='disabled')
self.button_state = 'disabled'
# Mostrar la ventana de progreso
self.progress_window = ProgressWindow()
# Ejecutar el test de velocidad en un hilo separado para no bloquear la UI
threading.Thread(target=self.run_speedtest).start()
def run_speedtest(self):
# Actualizar el mensaje de estado y mostrarlo en la ventana de progreso
self.progress_window.update_status("Espere, se está calculando...")
st = speedtest.Speedtest()
st.get_best_server()
# Realizar la prueba de velocidad
download_speed = st.download() / 1_000_000 # Convertir a Mbps
upload_speed = st.upload() / 1_000_000 # Convertir a Mbps
ping = st.results.ping
# Actualizar la UI con los resultados
self.ping_var.set(round(ping, 2))
self.ping_value_label.config(text=f"{ping:.2f} ms")
self.download_var.set(round(download_speed, 2))
self.upload_var.set(round(upload_speed, 2))
# Al final de la prueba, guardar los resultados en un archivo (opcional)
resultados = {
'timestamp': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
'ping': ping,
'download_speed': download_speed,
'upload_speed': upload_speed
}
guardar_resultados(resultados)
# Cerrar la ventana de progreso y actualizar el mensaje de estado en la ventana principal
self.progress_window.update_status("Prueba completada")
self.progress_window.close()
# Actualizar el mensaje de estado en la ventana principal
self.status_var.set("Prueba completada")
# Habilitar nuevamente el botón de inicio para permitir más pruebas
self.start_button.config(state='normal')
self.button_state = 'normal'
def disable_button(self):
self.start_button.config(state='disabled')
def guardar_resultados(resultados, filename='historial.txt'):
with open(filename, 'a') as file:
file.write(f"{resultados['timestamp']}, {resultados['ping']}, {resultados['download_speed']:.2f}, {resultados['upload_speed']:.2f}\n")
print("Resultados guardados en el archivo:", filename)
if __name__ == "__main__":
root = tk.Tk()
app = SpeedTestApp(root)
root.mainloop()
Подробнее здесь: https://stackoverflow.com/questions/786 ... rogressbar