0

Estoy trabajando con Tkinter, lo que el usuario ingrese al textbox este pasarlo a una funcion para que lo use en una url, pero no llego a tanto conocimiento

Segun yo era Entry.get() pero no manda nada

def __init__(self,window):
    # Entrada nombre
    Label(frame, text="Numero de Unidad:  ").grid(row=1, column=0)
    self.name = Entry(frame)
    self.name.focus()
    self.name.grid(row=1, column=1)

    # Consultar
    ttk.Button(frame, text='Consultar', command=self.datoSansara).grid(
        row=3, columnspan=2, sticky=W + E)

Esta seria la funcion inicial, donde pido la informacion

def datoSansara(self):
    #Pasamos la URL para la busqueda con la entrada desde tkinter
    url = "https://api.samsara.com/fleet/vehicles/locations/feed?vehicleIds=%s" % self.__init__.Entry.get()
    headers = {
        "Authorization": "Bearer xxxxxxxxxxxxxxxxxxxxxxx"}
    endCursor = ""
    querystring = {}

esta seria la siguiente funcion donde quisiera pasar el valor que ingresen no se si me logre explicar... espero y puedan guiarme un poco

Christian Gtz
  • 849
  • 1
  • 9
  • 24
  • Hola, efectivamente lo puedes conseguir con el método get, pero no veo cómo lo aplicas, si lo haces en el inicializador vas mal, en ese momento la app ni se ha mostrado en pantalla (por lo que el usuario difícilmente puede haber ingresado algo)... Necesitas un botón para llamar al método que necesita el valor (datoSansara) cuando se hace click o bien otro evento como pulsar Enter en el Entry, depende de lo que busques. En ese método y en ese momento es es dónde debes usar self.name.get (no Entry.get, que es la clase) – FJSevilla Jun 17 '20 at 16:34
  • Si, efectivamente no lo agrege, ya hice una modificacion espero que quede un poco mas claro... – Christian Gtz Jun 17 '20 at 16:44
  • Si, ahora está todo perfectamente claro, ahora te respondo. – FJSevilla Jun 17 '20 at 16:59

1 Answers1

2

Efectivamente el método que debes usar es tkinter.Entry.get, pero no lo estás usando correctamente:

  • Debes tener claro que el inicializador de una clase __init__ no se llama explícitamente excepto en casos concretos como en la herencia para llamar al inicializador del padre usando super. Te recomiendo mirarte éstaa pregunta si no tienes muy claro que es realmente __init__:

  • El método que debes usar es el del objeto no el de la clase, tienes una referencia a tu objeto de la clase Entry correctamente asociado al atributo de instancia self.name, debes por tanto hacer:

      self.name.get()
    

Es decir, algo como:

def datoSansara(self):
    # Pasamos la URL para la búsqueda con la entrada desde tkinter
    url_base = "https://api.samsara.com/fleet/vehicles/locations/feed?vehicleIds="
    url = f"{url_base}{self.name.get()}"
    headers = {
        "Authorization": "Bearer xxxxxxxxxxxxxxxxxxxxxxx"}
    endCursor = ""
    querystring = {}

Un ejemplo completo reproducible:

import tkinter as tk
from tkinter import ttk


class App(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent,  *args, **kwargs)
        tk.Label(self, text="Numero de Unidad:  ").grid(row=1, column=0)
        self.name = tk.Entry(self)
        self.name.focus()
        self.name.grid(row=1, column=1)

        # Consultar
        ttk.Button(
            self, text='Consultar', command=self.dato_sansara
            ).grid(row=3, columnspan=2, sticky="we")
            
    def dato_sansara(self):
        #Pasamos la URL para la busqueda con la entrada desde tkinter
        url_base = "https://api.samsara.com/fleet/vehicles/locations/feed?vehicleIds="
        url = f"{url_base}{self.name.get()}"
        print(url)

        
if __name__ == "__main__":
    root = tk.Tk()
    App(root).pack(expand=True, fill=tk.BOTH)
    root.mainloop()

Ten en cuenta que hacer una petición web de forma síncrona bloqueará el mainloop de la app y por tanto congelará la interfaz hasta que el método retorne, en Windows que es especialmente quisquilloso con ésto tendrá el típico mensaje de "la aplicación dejó de responder...". La petición deberías hacerla de forma asíncrona, por ejemplo usando un hilo.

FJSevilla
  • 55,603
  • 7
  • 35
  • 58
  • Muchas gracias, realmente me estas enseñando bastante, solo que soy algo nuevo aqui, podrias pasarme alguna liga para poder llamarla asincronicamente? – Christian Gtz Jun 17 '20 at 17:32