Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Modulos Python
#1
Hola buenas, vuelvo a tener una duda con python, esta vez es relacionada con los módulos. A ver yo estoy desarrollando una aplicacion donde tengo controles de usuario, entry, botones, etc...

Cada uno de esos controles tienen eventos (funciones que tengo declaradas arriba "def nombreFuncion():"), vale pues yo lo que quiero hacer es, de alguna manera, separar la parte gráfica de la parte "funcional" de la aplicación, para ello había pensado en crear un modulo donde poner todas las funciones pero claro, si una función hace uso de los controles de usuario que están en el .py original por así decirlo, en el otro modulo no existe ese control, no se si me explico.

Por ejemplo tengo un archivo "principal.py" donde tengo creado un botón y un campo Entry, y después tengo un modulo por ejemplo "modulo.py" para poner las funciones. Desde este segundo como puedo manejar los controles de usuario que hay en el primero?

No se si Python dispone de alguna forma de importar esos controles.

Gracias !!
Responder
#2
Hola Alfredo. Puedes pasar como argumentos los objetos que requieras usar desde tus eventos usando la función functools.partial(). Si tu aplicación está orientada a objetos (por ejemplo, como en el código de este artículo), sencillamente pasas la clase padre como argumento y desde allí tendrás acceso a todos los controles.

Saludos!
Responder
#3
no termino de entenderlo muy bien Francisco, te importaría ponerme un ejemplo básico?
Responder
#4
Hola Alfredo. Bien, supongamos que tenemos la siguiente aplicación.

  1. import tkinter as tk
  2. from tkinter import ttk
  3.  
  4. root = tk.Tk()
  5. entry = ttk.Entry(root)
  6. button = ttk.Button(root, text="Mostrar mensaje")
  7. entry.pack()
  8. button.pack()
  9. root.mainloop()


Quiero lograr que al apretar el botón me muestre en un cuadro de diálogo el contenido de la caja de texto. Para separar la parte gráfica de la lógica de la aplicación, voy a crear un nuevo archivo llamado events.py y allí voy a definir la función que debe encargarse de eso.

  1. # events.py
  2. from tkinter import messagebox
  3.  
  4. def show_message():
  5. messagebox.showinfo(message=entry.get())


Para que esta función sea invocada al presionar el botón, debemos hacer:

  1. import events
  2. # [...]
  3. button = ttk.Button(root, text="Mostrar mensaje",
  4. command=events.show_message)


El problema aquí es que show_message() no tendrá acceso a entry por cuanto está definido en otro módulo. Para solucionarlo, voy a pasárselo como argumento usando functools.partial().

  1. from functools import partial
  2. # [...]
  3. button = ttk.Button(root, text="Mostrar mensaje",
  4. command=partial(events.show_message, entry))


Y, por último, modificar los argumentos de la función para que ahora acepte la caja de texto.

  1. # events.py
  2. def show_message(entry):
  3. messagebox.showinfo(message=entry.get())


¡Espero haberme expresado con claridad!

Saludos
Responder
#5
Muchisimas gracias Francisco, me ha sido de mucha ayuda. Tengo otra pequeña duda, tengo un evento para un ENTRY para cuando pulse el boton ENTER:

entryPC = tk.Entry(relief=tk.GROOVE, bd=2)
entryPC.bind('<Return>', pressEnterAddWord)

def pressEnterAddWord(event):
if not entryPC.get():
messagebox.showwarning("Warning","Some word is needed")
else:
................

El problema es que esta funcion por lo que he visto tiene que recibir un parametro "event" obligatoriamente, como puedo aplicar lo que me has enseñado de usar "partial" para este tipo de funcion?

Un saludo y mil gracias
Responder
#6
Alfredo, deberías reformular tu función así:

  1. entryPC.bind('<Return>', partial(pressEnterAddWord, entryPC))
  2.  
  3. def pressEnterAddWord(entryPC, event):
  4. # [...]


Saludos!
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)