es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo actualizo mi widget de medidor (python, ttkbootstrap) usando los resultados que he recopilado de un pyspeedtest?

Estoy intentando actualizar mi widget de medidor con los resultados de una prueba de ping usando pyspeedtest, pero me aparece el siguiente error: “TypeError: Meter.configure() falta 1 argumento posicional requerido: ‘self'”. La función de ping funciona sin problemas, simplemente no puedo encontrar la forma de pasar el resultado del ping al parámetro “amountused” del medidor para cambiar el widget.

from tkinter import *
from tkinter.ttk import *
import ttkbootstrap as ttk
import pyspeedtest

root = Tk()
window = style.master
window_width = 300
window_height = 300
root.resizable(False, False)

ping_meter = ttk.Meter

ping_meter(
    master=root,
    metersize=300,
    padding=20,
    amountused=0,
    metertype='semi',
    subtext='milliseconds',
    interactive=False
).grid(sticky=N, row=0, column=1, padx=10, pady=10)

myping = IntVar()

def ping_test():
   t = pyspeedtest.SpeedTest(e1.get())
   myping.set(t.ping())
   ping_meter.configure(amountused = myping)

Label(root, text="Website URL:").grid(sticky=W, row=2, padx=10, pady=10)
Label(root, text="Ping Result:").grid(sticky=W, row=3, padx=10, pady=10)

result = Label(root, text="", textvariable=myping).grid(sticky=W, row=3, column=1, padx=10, pady=10)

e1 = Entry(root)
e1.grid(row=2, column=1)
b = Button(root, text="Check", command=ping_test)
b.grid(sticky=W, row=2, column=3, padx=10, pady=10)

mainloop()
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que estás intentando llamar a la función configure() en la clase Meter en lugar de una instancia de la clase.

    Para solucionar este error, necesitas crear una instancia del widget meter y luego llamar a la función configure en esa instancia:

    ping_meter_instance = ping_meter(
        master=root,
        metersize=300,
        padding=20,
        amountused=0,
        metertype='semi',
        subtext='milisegundos',
        interactive=False
    )
    ping_meter_instance.grid(sticky=N, row=0, column=1, padx=10, pady=10)
    
    def ping_test():
       t = pyspeedtest.SpeedTest(e1.get())
       myping.set(t.ping())
       ping_meter_instance.configure(amountused = myping.get())
    

    Aquí, creamos una instancia llamada “ping_meter_instance” y la ubicamos en la ventana root. Luego, en la función ping_test(), llamamos a la función configure en la instancia y pasamos el resultado del test de ping como el nuevo valor para el parámetro amountused.

    Además, debemos utilizar myping.get() en lugar de myping al pasarlo a la función configure ya que myping es una instancia de la clase Tkinter IntVar.

Comments are closed.