1
2
3
4
5
6
7
8
9 import sys
10 import os
11 from PyQt4 import QtCore, QtGui, QtWebKit, QtNetwork
12 import json
13
14 from asistente_base import Ui_AsistenteWindow
15 import pilas
16 import utils
17
19
34
36 direccion = QtCore.QUrl("http://www.pilas-engine.com.ar/version.json")
37 self.manager = QtNetwork.QNetworkAccessManager(self.main)
38 self.manager.get(QtNetwork.QNetworkRequest(direccion))
39
40 self.manager.connect(self.manager, QtCore.SIGNAL("finished(QNetworkReply*)"),
41 self._cuando_termina_de_consultar_version)
42
44 respuesta_como_texto = respuesta.readAll().data()
45 try:
46 respuesta_como_json = json.loads(str(respuesta_como_texto))
47
48 version_en_el_servidor = float(respuesta_como_json['version'])
49 version_instalada = float(pilas.pilasversion.VERSION)
50
51 if version_en_el_servidor == version_instalada:
52 mensaje = "- actualizada"
53 elif version_en_el_servidor < version_instalada:
54 mensaje = u"- desarrollo (versión estable en la web: %.2f)" %(version_en_el_servidor)
55 else:
56 mensaje = u"- desactualizada: la version %.2f ya está disponible en la web!)" %(version_en_el_servidor)
57 except ValueError:
58 mensaje = u"(sin conexión a internet)"
59
60 self.statusbar.showMessage(u"Versión " + pilas.version() + " " + mensaje)
61
62
64 QtWebKit.QWebSettings.globalSettings()
65 settings = QtWebKit.QWebSettings.globalSettings()
66 settings.setAttribute(QtWebKit.QWebSettings.DeveloperExtrasEnabled, True)
67 settings.setAttribute(QtWebKit.QWebSettings.LocalContentCanAccessFileUrls, True)
68
72
74 file_path = utils.obtener_ruta_al_recurso('asistente/index.html')
75
76
77 file_path = os.path.abspath(file_path)
78
79 contenido = self._obtener_html(file_path)
80 base_dir = QtCore.QUrl.fromLocalFile(file_path)
81 self.webView.setHtml(contenido, base_dir)
82
84 archivo = open(file_path, "rt")
85 contenido = archivo.read()
86 contenido = contenido.replace("{{VERSION_FRAME}}", """<iframe src='http://www.pilas-engine.com.ar/estadistica'></iframe>""")
87 archivo.close()
88 return contenido.decode('utf8')
89
91 seccion = str(url.path()).split('/')[-1]
92
93 if seccion == "interprete":
94 self._cuando_selecciona_interprete()
95 elif seccion == "manual":
96 self._cuando_selecciona_abrir_manual()
97 elif seccion == "web":
98 import webbrowser
99 webbrowser.open("http://www.pilas-engine.com.ar")
100 else:
101 partes = url.path().split('/')
102
103 if len(partes) == 4:
104 accion = partes[1]
105 categoria = partes[2]
106 ejemplo = partes[3]
107
108 if accion == "ejecutar":
109 self._ejecutar_ejemplo(str(categoria), str(ejemplo))
110 elif accion == "codigo":
111 self._mostrar_codigo(str(categoria), str(ejemplo))
112 else:
113 print accion, "sobre el ejemplo", ejemplo
114 else:
115 raise Exception(seccion + "es una opcion desconocida")
116
118 """Intenta ejecutar un programa de ejemplo en base a la categoria y nombre.
119
120 Internamente, esta funcion intenta buscar un archivo dentro de la
121 ruta "../ejemplos/ejemplos/{categoria}/{nombre}.py".
122 """
123 try:
124 ruta = self._obtener_ruta_al_ejemplo(categoria, nombre)
125
126 self.process = QtCore.QProcess(self.main)
127 self.process.setProcessChannelMode(QtCore.QProcess.MergedChannels)
128 self.process.finished.connect(self._cuando_termina_la_ejecucion_del_ejemplo)
129 self.process.start(sys.executable, [ruta])
130 except Exception, name:
131 QtGui.QMessageBox.critical(self.main, "Error", str(name))
132
134 try:
135 ruta = self._obtener_ruta_al_ejemplo(categoria, nombre)
136 file_path = utils.obtener_ruta_al_recurso('asistente/codigo.html')
137
138
139 file_path = os.path.abspath(file_path)
140
141 contenido = self._obtener_html(file_path)
142
143 import codecs
144 archivo_codigo = codecs.open(ruta, "r", "utf-8")
145 contenido_codigo = archivo_codigo.read()
146 archivo_codigo.close()
147 contenido = contenido.replace("{codigo}", contenido_codigo)
148 base_dir = QtCore.QUrl.fromLocalFile(file_path)
149 self.webView.setHtml(contenido, base_dir)
150 except Exception, name:
151 QtGui.QMessageBox.critical(self.main, "Error", str(name))
152
156
157
159 "Vuelve a permitir que se usen todos los botone de la interfaz."
160 salida = str(self.process.readAll())
161
162 if codigo:
163 QtGui.QMessageBox.critical(self.main, "Error al iniciar ejemplo", "Error: \n" + salida)
164
166 comando = " ".join([sys.executable, sys.argv[0], '-i'])
167 self._ejecutar_comando(comando)
168
170 comando = " ".join([sys.executable, sys.argv[0], '-i', str(nombre_archivo_script)])
171 self._ejecutar_comando(comando)
172
174 "Ejecuta un comando en segundo plano."
175 self.proceso = QtCore.QProcess()
176 self.proceso.startDetached(comando)
177
201
203 "Realizar una consulta usando un cuadro de dialogo."
204 return QtGui.QMessageBox.question(parent, titulo, mensaje,
205 QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
206
209
210
211 -class MainWindow(QtGui.QMainWindow):
212
213 - def __init__(self):
214 QtGui.QMainWindow.__init__(self)
215 self.setAcceptDrops(True)
216
219
220 - def dragEnterEvent(self, event):
221 if event.mimeData().hasUrls():
222 event.acceptProposedAction()
223
224 - def dragMoveEvent(self, event):
225 super(MainWindow, self).dragMoveEvent(event)
226
227 - def dropEvent(self, event):
228 if event.mimeData().hasUrls():
229 for url in event.mimeData().urls():
230 self.ui.ejecutar_script(url.path())
231 event.acceptProposedAction()
232 else:
233 super(MainWindow,self).dropEvent(event)
234
247