Aggiunto un oggetto Loader per caricare i file necessari

Leonardo Robol [2009-11-09 11:11]
Aggiunto un oggetto Loader per caricare i file necessari
indovinando il loro path
Filename
RaiTV/Interface.py
raitv.py
diff --git a/RaiTV/Interface.py b/RaiTV/Interface.py
index 1d59ba9..696f35d 100644
--- a/RaiTV/Interface.py
+++ b/RaiTV/Interface.py
@@ -30,12 +30,14 @@ from ChannelLoader import ChannelList

 class UI():

-    def __init__(self):
+    def __init__(self, loader):
         """Recupera tutti gli oggetti necessari aprendo
         il file .ui e costruisce quelli che mancano"""

+        self.loader = loader
+
         self.builder = gtk.Builder()
-        self.builder.add_from_file("ui/RaiTV.ui")
+        self.builder.add_from_file( loader.UIPath("RaiTV.ui") )

         self.win = self.builder.get_object("win")
         self.listacanali = self.builder.get_object("listacanali")
diff --git a/raitv.py b/raitv.py
index c73490f..8bfe359 100755
--- a/raitv.py
+++ b/raitv.py
@@ -16,14 +16,89 @@
 #    You should have received a copy of the GNU General Public License
 #    along with RaiTV; if not, write to the Free Software
 #    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
+#
+#
+#    Questo file contiene la classe Loader, che permette di caricare file
+#    esterni senza preoccuparsi di dove si trovano (a grandi linee). E' messa
+#    qui di modo che non ci si debba preoccupare di cercarla, altrimenti
+#    perderebbe tutta la sua utilità :)
+#
+
+__author__ = "Leonardo Robol <leo@robol.it>"
+
+import os, sys
+
+class Loader():
+
+    def __init__(self):
+        """Scopre in che directory è l'eseguibile e ne
+        deduce in che directory dovrebbero trovarsi i
+        vari oggetti utili"""
+
+        # Determino la cartella di lavoro
+        self.pwd = os.getcwd()
+
+        # e quella in cui sta il programma principale
+        self.bin = os.path.abspath(sys.argv[0])
+        self.bin = os.path.dirname(self.bin)
+
+        # Se questa è una cartella locale, allora
+        # cercheremo i file in locale, altrimenti
+        # nei luoghi atti allo scopo.
+        # Per determinarlo proviamo a cercare le directory che
+        # servono
+
+        os.chdir(self.bin)
+
+        try:
+            os.stat("ui")
+            os.stat("RaiTV")
+            self.local = True
+        except OSError:
+            self.local = False
+
+            ## A questo punto dobbiamo determinare dove sono i moduli
+            ## e file dell'interfaccia
+            ## TODO: Farlo per davvero.
+
+    def UIPath(self, filename):
+        """Ritorna il path di un file relativo all'interfaccia"""
+        if self.local:
+            return os.path.join(self.bin , "ui", filename)
+
+    def ModulePath(self):
+        """Ritorna il path da cui importare i moduli"""
+        if self.local:
+            return os.path.join(self.bin, "RaiTV")
+
+
+#
+#  Questo è il programma vero, che viene eseguito quando
+#  questo file viene eseguito direttamente
+#
+
+if __name__ == "__main__":
+
+    import gtk, pygtk
+
+    ## Creiamo l'oggetto Loader che si occuperà di
+    ## determinare la posizione dei file interessanti
+    loader = Loader()
+    sys.path.insert(0, loader.ModulePath())

+    ## Passiamo ad importare ciò che ci serve.
+    from RaiTV import Interface

-import gtk, pygtk
-from RaiTV import Interface
+    ## Passiamo all'interfaccia anche il loader di
+    ## modo che non si faccia troppi problemi
+    ## a caricare i suoi file
+    ui = Interface.UI(loader)

-ui = Interface.UI()
+    ## Mostriamo tutto
+    ui.show_all()

-ui.show_all()
+    ## Partiti :)
+    gtk.main()

-gtk.main()
ViewGit