1.
IMPORTS - Librerías usadas
python
import tkinter as tk
from tkinter import ttk, messagebox
import pickle
import os
from abc import ABC, abstractmethod
Explicación: Importa tkinter para la interfaz gráfica, pickle para guardar
datos, os para manejar archivos, y ABC para clases abstractas.
2. CLASE PERSONA - Abstracta base
python
class Persona(ABC):
@abstractmethod
def mostrar_info(self):
pass
Explicación: Define una plantilla abstracta. Cualquier clase que herede
de Persona DEBE tener el método mostrar_info(). No se puede instanciar
directamente.
3. CLASE USUARIO - Implementa Persona
python
class Usuario(Persona):
def __init__(self, nombre, cedula, correo, contrasena_encriptada,
titulos="", experiencia=""):
[Link] = nombre
[Link] = cedula
[Link] = correo
self.contrasena_encriptada = contrasena_encriptada
[Link] = False
[Link] = titulos
[Link] = experiencia
def mostrar_info(self):
return f"Usuario: {[Link]}, Títulos: {[Link]}, Experiencia:
{[Link]}"
Explicación: Crea usuarios con datos personales, títulos y
experiencia. contratado=False inicialmente. Implementa el método
abstracto mostrar_info().
4. CLASE USUARIOESTUDIANTE - Hereda de Usuario
python
class UsuarioEstudiante(Usuario):
def __init__(self, nombre, cedula, correo, contrasena_encriptada,
universidad, titulos="", experiencia=""):
super().__init__(nombre, cedula, correo, contrasena_encriptada,
titulos, experiencia)
[Link] = universidad
def mostrar_info(self):
return f"Estudiante: {[Link]}, Universidad: {[Link]},
Títulos: {[Link]}, Experiencia: {[Link]}"
Explicación: Usuario especializado con universidad. Reutiliza
constructor del padre con super() y sobrescribe mostrar_info() para
incluir la universidad.
5. CLASE EMPRESA - También Persona
python
class Empresa(Persona):
def __init__(self, nombre_empresa, tipo_empresa, correo_empresa,
contrasena_encriptada, cualidades_requeridas=""):
self.nombre_empresa = nombre_empresa
self.tipo_empresa = tipo_empresa
self.correo_empresa = correo_empresa
self.contrasena_encriptada = contrasena_encriptada
[Link] = []
self.cualidades_requeridas = cualidades_requeridas
def mostrar_info(self):
return f"Empresa: {self.nombre_empresa}, Busca:
{self.cualidades_requeridas}"
Explicación: Representa una empresa que busca empleados. Tiene lista
de empleados (empleados=[]) y especifica qué cualidades requiere.
6. CLASE EMPRESATECNOLOGICA - Hereda de Empresa
python
class EmpresaTecnologica(Empresa):
def __init__(self, nombre_empresa, tipo_empresa, correo_empresa,
contrasena_encriptada, tecnologia_principal, cualidades_requeridas=""):
super().__init__(nombre_empresa, tipo_empresa, correo_empresa,
contrasena_encriptada, cualidades_requeridas)
self.tecnologia_principal = tecnologia_principal
def mostrar_info(self):
return f"Empresa Tecnológica: {self.nombre_empresa}, Tecnología:
{self.tecnologia_principal}, Busca: {self.cualidades_requeridas}"
Explicación: Empresa especializada en tecnología.
Añade tecnologia_principal a los atributos de empresa y lo incluye en la
información mostrada.
7. CLASE CONEXIONUNIVERSITARIA - Gestor del sistema
python
class ConexionUniversitaria:
def __init__(self):
[Link] = []
[Link] = []
self.cargar_datos()
Explicación: Clase principal que maneja las listas de usuarios y
empresas. Llama a cargar_datos() al iniciar para recuperar información
anterior.
8. MÉTODOS DE CONEXIONUNIVERSITARIA
python
def encriptar(self, texto):
return [Link](texto)
def desencriptar(self, dato):
return [Link](dato)
def guardar_datos(self):
with open("conexion_data.pkl", "wb") as f:
[Link]({"usuarios": [Link], "empresas":
[Link]}, f)
def cargar_datos(self):
try:
if [Link]("conexion_data.pkl"):
with open("conexion_data.pkl", "rb") as f:
data = [Link](f)
[Link] = [Link]("usuarios", [])
[Link] = [Link]("empresas", [])
except Exception as e:
[Link]("Error", f"No se pudieron cargar los
datos: {e}")
[Link] = []
[Link] = []
Explicación:
encriptar/desencriptar: Convierten texto a bytes y viceversa
(serialización pickle)
guardar_datos: Guarda ambas listas en archivo
"conexion_data.pkl"
cargar_datos: Intenta cargar datos del archivo si existe, si hay
error muestra mensaje
9. LOGINWINDOW - Ventana inicial
python
class LoginWindow:
def __init__(self, master, app):
[Link] = master
[Link] = app
[Link]("Iniciar Sesión")
[Link]("350x350")
[Link](master, text="Correo").pack(pady=5)
self.entry_correo = [Link](master)
self.entry_correo.pack()
[Link](master, text="Contraseña").pack(pady=5)
self.entry_contra = [Link](master, show="*")
self.entry_contra.pack()
[Link](master, text="Ingresar como Usuario",
command=self.login_usuario).pack(pady=10)
[Link](master, text="Ingresar como Empresa",
command=self.login_empresa).pack(pady=10)
[Link](master, text="Registrar Usuario",
command=self.registrar_usuario).pack(pady=10)
[Link](master, text="Registrar Empresa",
command=self.registrar_empresa).pack(pady=10)
Explicación: Crea ventana de login con dos campos (correo/contraseña)
y cuatro botones para diferentes acciones del sistema.
10. MÉTODOS LOGIN - Validación
python
def login_usuario(self):
c = self.entry_correo.get()
pw = self.entry_contra.get()
for u in [Link]:
if [Link] == c and
[Link](u.contrasena_encriptada) == pw:
UserDashboard([Link]([Link]), [Link], u)
return
[Link]("Error", "Credenciales inválidas")
Explicación: Obtiene datos de los campos, busca usuario por correo,
compara contraseña desencriptada. Si encuentra, abre dashboard del
usuario; si no, muestra error.
11. REGISTROUSUARIO - Formulario
python
class RegistroUsuario:
def __init__(self, master, app):
[Link] = master
[Link] = app
[Link]("Registrar Usuario")
[Link]("350x500")
[Link](master, text="Tipo de Usuario").pack(pady=5)
self.tipo_var = [Link](value="General")
[Link](master, textvariable=self.tipo_var,
values=["General", "Estudiante"]).pack()
campos = ["Nombre", "Cédula", "Correo", "Contraseña", "Títulos",
"Experiencia"]
[Link] = {}
for c in campos:
[Link](master, text=c).pack(pady=5)
e = [Link](master, show="*" if c == "Contraseña" else None)
[Link]()
[Link][c] = e
self.label_universidad = [Link](master, text="Universidad")
self.entry_universidad = [Link](master)
self.tipo_var.trace("w", self.actualizar_campos)
[Link](master, text="Guardar",
command=[Link]).pack(pady=20)
Explicación: Formulario con 6 campos básicos y combobox para tipo de
usuario. Crea diccionario entries para manejar todos los campos de
entrada.
12. ACTUALIZAR_CAMPOS - Formulario dinámico
python
def actualizar_campos(self, *args):
if self.tipo_var.get() == "Estudiante":
self.label_universidad.pack(pady=5)
self.entry_universidad.pack()
else:
self.label_universidad.pack_forget()
self.entry_universidad.pack_forget()
Explicación: Muestra u oculta el campo "Universidad" según si se
selecciona "Estudiante" en el combobox. Usa pack() para mostrar
y pack_forget() para ocultar.
13. GUARDAR USUARIO - Validación y creación
python
def guardar(self):
datos = {k: [Link]() for k, v in [Link]()}
if "" in [Link]():
[Link]("Error", "Todos los campos son
obligatorios")
return
tipo = self.tipo_var.get()
enc = [Link](datos["Contraseña"])
if tipo == "Estudiante":
universidad = self.entry_universidad.get()
if not universidad:
[Link]("Error", "Universidad es obligatoria
para estudiantes")
return
usuario = UsuarioEstudiante(datos["Nombre"], datos["Cédula"],
datos["Correo"], enc, universidad, datos["Títulos"], datos["Experiencia"])
else:
usuario = Usuario(datos["Nombre"], datos["Cédula"],
datos["Correo"], enc, datos["Títulos"], datos["Experiencia"])
[Link](usuario)
[Link].guardar_datos()
[Link]("Éxito", "Usuario registrado")
[Link]()
Explicación:
1. Obtiene datos de todos los campos
2. Valida que ningún campo esté vacío
3. Encripta la contraseña
4. Crea UsuarioEstudiante o Usuario según el tipo
5. Añade a lista de usuarios
6. Guarda datos en archivo
7. Muestra mensaje de éxito y cierra ventana
14. REGISTROEMPRESA - Similar a RegistroUsuario
python
class RegistroEmpresa:
# Estructura similar a RegistroUsuario pero para empresas
def actualizar_campos(self, *args):
if self.tipo_var.get() == "Tecnologica":
self.label_tecnologia.pack(pady=5)
self.entry_tecnologia.pack()
else:
self.label_tecnologia.pack_forget()
self.entry_tecnologia.pack_forget()
Explicación: Clase similar a RegistroUsuario pero para empresas.
Campo dinámico "Tecnología Principal" aparece solo para empresas
tecnológicas.
15. USERDASHBOARD - Panel de usuario
python
class UserDashboard:
def __init__(self, master, app, user):
[Link] = master
[Link] = app
[Link] = user
[Link]("Panel Usuario")
[Link]("350x300")
[Link](master, text=f"Bienvenido
{[Link]}").pack(pady=10)
estado = "Contratado" if [Link] else "Disponible"
[Link](master, text=f"Estado: {estado}").pack(pady=10)
[Link](master, text=user.mostrar_info()).pack(pady=10)
Explicación: Muestra panel personalizado con nombre del usuario,
estado laboral (contratado/disponible) y toda su información
usando mostrar_info().
16. EMPRESADASHBOARD - Panel de empresa
python
class EmpresaDashboard:
def __init__(self, master, app, empresa):
[Link] = master
[Link] = app
[Link] = empresa
[Link]("Panel Empresa")
[Link]("450x500")
[Link](master, text=empresa.mostrar_info()).pack(pady=10)
if isinstance(empresa, EmpresaTecnologica):
[Link](master, text=f"Tecnología Principal:
{empresa.tecnologia_principal}").pack(pady=10)
[Link](master, text="Ver Usuarios Disponibles",
command=self.ver_disponibles).pack(pady=10)
[Link](master, text="Ver Mis Contratados",
command=self.ver_contratados).pack(pady=10)
Explicación: Panel empresarial con información de la empresa y dos
botones principales: ver usuarios disponibles y ver usuarios ya
contratados.
17. VER_DISPONIBLES - Tabla de usuarios
python
def ver_disponibles(self):
v = [Link]([Link])
[Link]("Usuarios Disponibles")
tabla = [Link](v, columns=("Nombre", "Correo", "Cédula",
"Títulos", "Experiencia"), show="headings")
for c in ("Nombre", "Correo", "Cédula", "Títulos", "Experiencia"):
[Link](c, text=c)
[Link](fill="both", expand=True)
for u in [Link]:
if not [Link]:
[Link]("", "end", iid=[Link], values=([Link],
[Link], [Link], [Link], [Link]))
Explicación: Abre nueva ventana con tabla (Treeview) que muestra solo
usuarios con contratado=False. Muestra 5 columnas con información
completa.
18. CONTRATAR - Lógica de contratación
python
def contratar():
sel = [Link]()
if not sel:
return
cid = sel[0]
for u in [Link]:
if [Link] == cid:
[Link] = True
[Link](u)
[Link].guardar_datos()
[Link]("Éxito", "Usuario contratado")
[Link]()
return
Explicación: Al seleccionar usuario en tabla: cambia contratado a True,
añade a lista de empleados de la empresa, guarda cambios en archivo,
muestra éxito y cierra ventana.
19. VER_CONTRATADOS - Ver empleados
python
def ver_contratados(self):
v = [Link]([Link])
[Link]("Contratados")
tabla = [Link](v, columns=("Nombre", "Correo", "Cédula",
"Títulos", "Experiencia"), show="headings")
for c in ("Nombre", "Correo", "Cédula", "Títulos", "Experiencia"):
[Link](c, text=c)
[Link](fill="both", expand=True)
for u in [Link]:
[Link]("", "end", values=([Link], [Link], [Link],
[Link], [Link]))
Explicación: Similar a ver_disponibles() pero muestra solo usuarios que
están en [Link].
20. MAINLOOP - Punto de entrada
python
root = [Link]()
app = ConexionUniversitaria()
LoginWindow(root, app)
[Link]()
Explicación:
1. [Link]() crea ventana principal
2. ConexionUniversitaria() crea gestor de datos
3. LoginWindow() muestra pantalla de login
4. mainloop() inicia ciclo de eventos de tkinter