Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
[tkinter] Importar al programa principal las funciones de otro modulo
#11
El problema es que from directorio import * no importa todos los módulos dentro de ese directorio, sino simplemente todos los objetos dentro del archivo directorio/__init__.py. Lo que generalmente se hace es importar todos los módulos dentro de __init__.py. Por ejemplo, si tu estructura es la siguiente:

Código:
- directorio
   | - __init__.py
   | - modulo1.py
   | - modulo2.py
   | - modulo3.py

Para poder importar los módulos 1-3 usando from directorio import *, deberías poner dentro de __init__.py:

Código:
from . import modulo1
from . import modulo2
from . import modulo3

Saludos
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#12
(14-07-2019, 03:12 PM)Francisco escribió: El problema es que from directorio import * no importa todos los módulos dentro de ese directorio, sino simplemente todos los objetos dentro del archivo directorio/__init__.py. Lo que generalmente se hace es importar todos los módulos dentro de __init__.py. Por ejemplo, si tu estructura es la siguiente:

Código:
- directorio
  | - __init__.py
  | - modulo1.py
  | - modulo2.py
  | - modulo3.py

Para poder importar los módulos 1-3 usando from directorio import *, deberías poner dentro de __init__.py:

Código:
import modulo1
import modulo2
import modulo3

Saludos

Ostras, ¡MUCHAS GRACIAS!.

Este tema me interesa porque en ningún lado lo explican detalladamente. ¿Todos los directorios/subdirectorios deben tener el archivo __init__.py?.
Supongamos que yo tengo un directorio. /home/Templates/Mi_app

Dentro de Mi_app (Aquí va el módulo principal) hay varios subdirectorios: Centro de control, icons, sounds etc etc y cada uno con módulos distintos.
Es decir esto quedaría:

Código:
Mi_app
|--__init__.py
|--módulo1.py
|--módulo2.py
    |--Centro de Control
        |--__init__.py
        |--módulo1.py
        |--módulo2.py

Para importar todos los objetos, todos los directorios, es decir, absolutamente todo, ¿Cual sería la instrucción?.
¿Habría que meter todos los import de los módulos en su correspondiente __init__.py?
Responder
#13
En las últimas versiones de Python el archivo __init__.py es opcional, pero lo vas a necesitar si querés que una carpeta funcione como un módulo. No obstante, por ejemplo, los módulos dentro de "Centro de Control" no los vas a poder importar porque las carpetas no pueden tener espacios (a menos que lo agregues manualmente a sys.path, pero no es una práctica muy recomendada).

(15-07-2019, 05:36 AM)Myszowor escribió: ¿Habría que meter todos los import de los módulos en su correspondiente __init__.py?

Exactamente.
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#14
(15-07-2019, 03:27 PM)Francisco escribió: En las últimas versiones de Python el archivo __init__.py es opcional, pero lo vas a necesitar si querés que una carpeta funcione como un módulo. No obstante, por ejemplo, los módulos dentro de "Centro de Control" no los vas a poder importar porque las carpetas no pueden tener espacios (a menos que lo agregues manualmente a sys.path, pero no es una práctica muy recomendada).

(15-07-2019, 05:36 AM)Myszowor escribió: ¿Habría que meter todos los import de los módulos en su correspondiente __init__.py?

Exactamente.

Un momento, un momento que esto me va a salvar la vida.(Quizá no tanto pero me va a ahorrar muchísimo tiempo)

Entonces para hacer una app lo ideal es: El directorio(Carpeta) raíz. (Llamémosle Mi_app).

Dentro de esa carpeta, el módulo __init__.py en el que realizas un import de todos los módulos que hay en dicha carpeta(Mi_app). y el resto de los módulos que quieras que formen la app ¿No?. Si yo hago todos los import en el archivo __init__.py,

¿Es necesario hacer un import en cada módulo de los módulos que voy a utilizar?. Los que no sean generales, tipo time, threading, tkinter etc,me refiero. Porque esos, evidentemente, hay que importarlos

Es decir tengo el __init__.py con todos los import. (import modulo1.py, import modulo2.py) ¿Cuando esté desarrollando uno de los módulos para que interactuen unos con otros tendré que hacer el import modulo1 en el modulo2 y viceversa?

No sé si me explico bien.
Responder
#15
Basta con importar todos los módulos dentro de Mi_app/__init__.py. Hecho esto, luego tienes varias formas de acceder a ellos:

Código:
# Opción 1
import Mi_app
Mi_app.modulo1.ejemplo("Hola mundo")

# Opción 2
from Mi_app import modulo1
modulo1.ejemplo("Hola mundo")

# Opción 3 (si unicamente importas los módulos en __init__.py
# y no defines otros objetos)
from Mi_app import *
modulo1.ejemplo("Hola mundo")

Saludos
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#16
(17-07-2019, 10:18 PM)Francisco escribió: Basta con importar todos los módulos dentro de Mi_app/__init__.py. Hecho esto, luego tienes varias formas de acceder a ellos:

Código:
# Opción 1
import Mi_app
Mi_app.modulo1.ejemplo("Hola mundo")

# Opción 2
from Mi_app import modulo1
modulo1.ejemplo("Hola mundo")

# Opción 3 (si unicamente importas los módulos en __init__.py
# y no defines otros objetos)
from Mi_app import *
modulo1.ejemplo("Hola mundo")

Saludos
Muchas Gracias. Ahora que he vuelto de vacaciones me vuelvo a poner manos a la obra pero por algún motivo no me deja incluir una carpeta y todos sus módulos en la app principal.
Digamos que mi esquema es: Mi_app (Directorio) modulo __init__, modulo 2, modulo 3
                                           amb (Directorio dentro de Mi_app) modulo __init__, modulo 4, modulo 5
Pues bien cuando intento acceder a un módulo del directorio amb (que no es sino una carpeta) me dice que los módulos dentro de esa carpeta no existen.
Alguna idea de cual puede ser el problema. (Sé que está en los import pero no sé que es lo que hago mal)
Responder
#17
A priori es muy difícil cuál es el problema. ¿Cuál es el código que estás usando exactamente para importar tu módulo?
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#18
(15-08-2019, 12:04 AM)Francisco escribió: A priori es muy difícil cuál es el problema. ¿Cuál es el código que estás usando exactamente para importar tu módulo?
Buenas, siento tardar en contestar pero he estado liado.

Bueno pues el esquema es el siguiente:

Carpeta principal Miapp.

Dentro de esta carperta hay tres módulos: Ccl.py, SAB01.py y por último  App112.py. A esto hay que sumar el módulo __init__ (dentro del cual están los siguientes import:

from Ccl import *
from SAB01 import *
from App112 import *
from amb import *

Hay también dentro de la carpeta principal 3 carpetas más: icons (dónde están los iconos que uso para los botones y etiquetas), sounds(Lo mismo que la anterior solo que aquí están los sonidos) y por último otra caperta llamada amb.

Dentro de esta última carpeta hay un módulo llamado SAB02.py que es una copia del módulo SAB01 (es de prueba para ver como importar los módulos de una subcarpeta a la app principal) y el módulo __init__ con el siguiente import:

from SAB02 import *

Bien cuando intento acceder al módulo SAB02 desde la app principal (App112)me indica el programa que no existe dicho módulo y ni siquiera arranca la app. Pongo aquí el error en concreto.

Traceback (most recent call last):
  File "App112.py", line 14, in <module>
    from Ccl import *
  File "/home/juan/Templates/Python/App112/Ccl.py", line 14, in <module>
    from SAB01 import *
  File "/home/juan/Templates/Python/App112/SAB01.py", line 15, in <module>
    from App112 import *
  File "/home/juan/Templates/Python/App112/App112.py", line 16, in <module>
    from amb import *
  File "/home/juan/Templates/Python/App112/amb/__init__.py", line 1, in <module>
    from SAB02 import *
ModuleNotFoundError: No module named 'SAB02'

Muchas Gracias.

P.D. Aquí pongo todos los import que tengo en el módulo App112.

from tkinter import *
from tkinter import ttk
from datetime import *
from tkinter import messagebox
import time
import calendar
import psycopg2
import threading
from threading import Timer
import os
import sys
import tkinter.font as tkfont
from functools import partial
from Ccl import *
from SAB01 import *
from amb import *
Responder
#19
El problema es que no estás haciendo uso del punto para indicar cuándo los módulos que importás son relativos al archivo desde el cual están siendo importados.

Te recomiendo que leas esta sección: http://docs.python.org.ar/tutorial/3/mod...n-paquetes; y vuelvas a chequear este mensaje mío: https://foro.recursospython.com/showthre...11#pid1311, donde cambié los módulos a relativos.

Saludos
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#20
(22-08-2019, 07:18 PM)Francisco escribió: El problema es que no estás haciendo uso del punto para indicar cuándo los módulos que importás son relativos al archivo desde el cual están siendo importados.

Te recomiendo que leas esta sección: http://docs.python.org.ar/tutorial/3/mod...n-paquetes; y vuelvas a chequear este mensaje mío: https://foro.recursospython.com/showthread.php?tid=295&pid=1311#pid1311, donde cambié los módulos a relativos.

Saludos
 Joer, muchísimas gracias.

El __all__ es justo lo que necesitaba.
Responder


Salto de foro:


Usuarios navegando en este tema: 2 invitado(s)