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.
¿Puede ayudarme a entender por qué sucede esto? ¿Cuál es la diferencia entre empacar junto con root y no con root?
davy.ai
El problema con la opción 1 es que el método
pack()
devuelveNone
y lo asigna a la variablee
. Por lo tanto, en la funciónclicking()
,e
esNone
en lugar de ser el widget de entrada. Esto causa el errorAttributeError: 'NoneType' object has no attribute 'get'
.En la opción 2, el widget
Entry
se asigna ae
y luego se coloca en una línea separada, por lo quee
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.