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.

Python tkinter – pack append vs pack separado de la raíz

Soy un traductor de español que traduce documentos de TI. Traduzca lo siguiente al español. No traduzca el código y la salida en markdown.

Soy nuevo en Python y tkinter. Intentando escribir un código Python simple para obtener el nombre de usuario e imprimirlo

Entonces, intenté lo siguiente

root = Tk() # línea 1
e = Entry(root, width = 50).pack() # opción 1 de línea 2: da el siguiente error como se muestra a continuación
e = Entry(root, width = 50) # opción 2 de línea 2: funciona bien
e.pack() # opción 2 de línea 3 funciona bien
def clicking():
    word = "Hola " + e.get()
    myLabel = Label(root,text=word).pack()
myButton = Button(root, text = 'Generar', command = clicking).pack()

Cuando hago clic en el botón Generar, espero ver una salida como “Hola John”

Pero obtengo el siguiente error cuando escribo la línea 2 como se muestra en la opción 1 de la línea 2 anterior

Excepción en la devolución de llamada de Tkinter
Traceback (most recent call last):
  File "C:\Users\test\Anaconda3\lib\tkinter\__init__.py", line 1892, in __call__
    return self.func(*args)
  File "C:\Users\test~1\AppData\Local\Temp/ipykernel_8876/988003047.py", line 4, in clicking
    word = "Hola " + e.get()
AttributeError: el objeto de tipo 'NoneType' no tiene el atributo 'get'

Sin embargo, cuando escribo la línea 2 como dos líneas separadas como se muestra en la opción 2 de la línea 2 y la opción 2 de la línea 3, funciona bien y obtengo la siguiente salida.

enter image description here

¿Puede ayudarme a entender por qué sucede esto? ¿Cuál es la diferencia entre empacar junto con root y no con root?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con la opción 1 es que el método pack() devuelve None y lo asigna a la variable e. Por lo tanto, en la función clicking(), e es None en lugar de ser el widget de entrada. Esto causa el error AttributeError: 'NoneType' object has no attribute 'get'.

    En la opción 2, el widget Entry se asigna a e y luego se coloca en una línea separada, por lo que e retiene la referencia al widget incluso después de colocarlo.

    Por lo tanto, es importante asignar y colocar widgets en líneas separadas para que las variables hagan referencia a los widgets correctos.

Comments are closed.