Estas usando el método especial __init__
como nombre de clase y no como método de la clase (no se que intentas hacer en esa línea, posiblemente estes confundiendo conceptos.).
El método __init__
se encarga de inicializar la clase, de darle un determinado estado a tu objeto nada más ser instanciado. Se ejecuta automáticamente al instanciar la clase y es algo similar a lo que se conoce como "constructor" en otros lenguajes. En tu caso se se encarga de recibir como parámetro la instancia raíz para tu Label
y de crearlo.
Mírate estas dos preguntas para más información:
Debes usar la palabra reservada class
para definir una clase y def
para definir métodos (como el método __init__
).
El uso de for modulo import *
es una muy mala práctica que debes evitar, más aun si estas aprendiendo (ver PEP 8). El código es menos legible y puede inducir a errores al sobrescribir por error algún método (sobretodo en bibliotecas complejas). Te lo vas a encontrar a menudo, sobretodo en tutoriales de Tkinter (en parte, por culpa de la documentación de effbot.org), lo cual no implica que no sea una mala idea, como el famoso using namespace std;
de C++... :). No pasa nada en un ejemplo simple como este, pero para no coger malos hábitos, mejor evitarlo. Recuerda el zen de Python:
"Explícito es mejor que implícito"
En su lugar usa una de las siguientes formas:
from tkinter import Label, Tk
import tkinter
o la más generalizada (para ahorrarse caracteres):
El parámetro self
es una convención. Los métodos de instancia deben recibir como primer parámetro la referencia a la instancia de la clase a la que pertenecen. self
es solo eso, la referencia a la instancia a la que pertenece el método. Cuando se llama un método de instancia es pasado automáticamente. Delante de los atributos (como en el __init__
) indican que son atributos de instancia.
Si tenemos la clase:
class Foo:
def bar():
print("Soy un método de la instancia: ", self)
Instanciamos y llamamos a su método así:
>>> instancia = Foo()
>>> instancia.bar()
Soy un método de la instancia: <__main__.Foo object at 0x7f4e0a267080>
Esto es lo mismo que hacer (para que se entienda lo que es self
):
>>> instancia = Foo()
>>> Foo.bar(instancia)
Soy un método de la instancia: <__main__.Foo object at 0x7f8436622cc0>
Puedes ver una explicación mucho más extendida en la siguiente publicación:
Tu código no tiene más problemas, aparte de un error tipográfico en el primer parámetro al instanciar Label
, debería ser así:
import tkinter as tk
class Interfaz(): #Definición de tu clase llamada Intefaz
def __init__(self, contenedor): #Definición de su método __init__ Intefaz
self.e1 = tk.Label(contenedor, text ="Etiqueta1", fg="black", bg="white")
self.e1.pack()
ventana = tk.Tk() #Instancia de la clase Tk.
miInterfaz= Interfaz(ventana) #Instancia de tu clase Interfaz.
ventana.mainloop()