Как сделать спидометр без прогрессбараPython

Программы на Python
Anonymous
Как сделать спидометр без прогрессбара

Сообщение Anonymous »

У меня есть проект по тестированию скорости с использованием измерителя скорости или тахометра в режиме реального времени, но я не могу найти библиотеку с примерами, объясняющими, как их использовать....
Я попытался с помощью индикатора выполнения указать, как повышается или понижается скорость 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

Вернуться в «Python»