Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] Problema con ventana wxPython, se traba al comprobar conexiones sockets

Estas en el tema de Problema con ventana wxPython, se traba al comprobar conexiones sockets en el foro de Python en Foros del Web. Hola amigos!! :) Tengo un problema, que no es grave pero me encantaría poder solucionarlo. Estoy terminando de crear un programa en Python con interfaz ...
  #1 (permalink)  
Antiguo 12/03/2014, 19:01
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Problema con ventana wxPython, se traba al comprobar conexiones sockets

Hola amigos!! :)
Tengo un problema, que no es grave pero me encantaría poder solucionarlo.
Estoy terminando de crear un programa en Python con interfaz gráfica wxPython y hasta ahora todo me funcionaba muy bien, pero cuando ya me puse a trabajar con respecto a los sockets, el programa se clave, osea se queda como trabado.
Bueno yo estoy haciendo un Escaner de puertos TCP y ya me falta muy poco para terminarlo, hasta ahora me salió bien, pero mi problema es que cuando se empieza el escaneo de una cierta IP, el programa se congela, si es lógico que esto suceda ya que el socket utiliza mucho recurso del programa, pero al trabarmelo así lamentablemente no se logra apreciar el medidor de procesamiento, que su definición correcta es el Gauge, eso no responde, al igual que cuando se agregan nuevos Items a en un panel de ListCtrl, cláro al estar comprobando las conexiones me lo traba así pero no se logra visualizar el Gauge cuando va cargando, ni tampoco cuando se agregan los Item en el ListCtrl.
He utilizado varios métos, como threading.Thread(target=...... pero no me dió resultado, hasta incluso he cambiado varias partes del código y lo mismo sucede :(
Lo que si funciona bien (a modo de prueba para saber si una IP tiene X puerto abierto) es la ventana de informes cuando en la clase de la ventana del programa utilizo print "Puerto abierto" o print "Puerto cerrado" eso no se clava, responde en el momento.
Bueno amigos ese es mi problema, ojalá exista una solución para eso, yo creo que la solución es utilizar 2 clases, una para la ventana del programa y la otra para comprobar la conexión pero necesitaría trabajar con Herencias, para poder conservar los valores de las variables, quizás me equivoco, si es afirmativo lo que digo, me podrían dar un ejemplo por favor, les agradecería mucho.
Gracias por siempre por toda la mano que me dan, un abrazo para todos y éxitos!!!
  #2 (permalink)  
Antiguo 13/03/2014, 13:17
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 2 meses
Puntos: 35
Respuesta: Problema con ventana wxPython, se traba al comprobar conexiones sockets

Se supone que usando threads no deberias tener problemas, probablemente estas aplicando mal el codigo, que tal si nos muestras un poco?
  #3 (permalink)  
Antiguo 13/03/2014, 15:01
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con ventana wxPython, se traba al comprobar conexiones sockets

Hola amigo carbon, si cláro te mostraré el código :)
Antes te quiero comentar que he utilizado la clase de threading.Thread y lo mismo me sigue pasando.
La ventana del programa tiene una clase y ahora he creado otra clase más en mi código "class Soket(threading.Thread):", pero ni siquiera aun así funciona, lo mismo se clave, he dejado de usar el Gauge, así que sólo tendría que agregar los Items en el panel de ListCtrl, pero al comprobar una conexión se clava, queda como cargando, pero me clava la ventana y no se puede ver los puertos ni abiertos ni cerrados.
Yo pensaba que, como la conexión socket estaba dentro del bucle (MainLoop()) de la clase de la ventana eso era el problema, ya que estaba metido ahí adentro, entónces decidí sacarlo de ahí, sacar a la función que hace la comprobación de puertos, por lo que habría 2 clases separadas, heredé los valores de las variables, osea los argumentos y ahora se conservan los valores, en la otra clase del socket, sin embargo se sigue clavando. Aquí te dejo la clase del socket:

Código Python:
Ver original
  1. class Soket(threading.Thread):
  2.     def __init__(self, Incremento, IncNums, Total, ComprobarIP, gauge, Listado, COMPPUERTOS):
  3.         threading.Thread.__init__(self)
  4.         self.INCREMENTO = Incremento
  5.         self.INCNUMS = IncNums
  6.         self.TOTAL = Total
  7.         self.COMPROBARIP = ComprobarIP
  8.         self.BarraProgreso = gauge
  9.         self.Listado = Listado
  10.         self.PUERTOS = COMPPUERTOS
  11.         self.lalas()
  12.     def lalas(self):
  13.         if self.INCREMENTO < self.TOTAL:
  14.             try:
  15.                 self.puertito = int(self.PUERTOS[self.INCREMENTO])
  16.                 Conexion = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  17.                 Conexion.connect((self.COMPROBARIP, self.puertito))
  18.                 #print "Puerto abierto"
  19.                 self.INCREMENTO += 1
  20.                 self.INCNUMS += 1
  21.                 Conexion.close()
  22.                 self.Listado.InsertStringItem(0, "hola")
  23.                 self.Listado.SetStringItem(0, 1, "hola")
  24.                 self.Listado.SetStringItem(0, 2, "hola")
  25.                 self.Listado.SetStringItem(0, 3, "hola")
  26.                 self.lalas()
  27.             except:
  28.                 self.puertito = int(self.PUERTOS[self.INCREMENTO])
  29.                 #print "Puerto cerrado"
  30.                 self.INCREMENTO += 1
  31.                 self.INCNUMS += 1
  32.                 self.Listado.InsertStringItem(0, "hola")
  33.                 self.Listado.SetStringItem(0, 1, "hola")
  34.                 self.Listado.SetStringItem(0, 2, "hola")
  35.                 self.Listado.SetStringItem(0, 3, "hola")
  36.                 self.lalas()

Y la función que llama a esta clase es esta (la función que está dentro de clase wx.Frame):

Código Python:
Ver original
  1. def Escaneo(self, event):
  2.         ValorIngresado = self.CajaPuertos.GetValue()
  3.         IPIngresada = self.CajaIP.GetValue()
  4.         ValorIngresado = ValorIngresado.replace("0", "").replace("1", "").replace("2", "").replace("3", "").replace("4", "").replace("5", "").replace("6", "").replace("7", "").replace("8", "").replace("9", "").replace(" ", "")
  5.         if ValorIngresado == "" and IPIngresada.count(".") == 3:
  6.             Incremento = 0
  7.             IncNums = 0
  8.             Total = self.CajaPuertos.GetValue().count(" ")
  9.             Total += 1
  10.             ComprobarIP = self.CajaIP.GetValue()
  11.             Panel_Gauge = wx.Panel(self, -1, pos=(22, 315), size=(520,25))
  12.             Gauge_BoxSizer = wx.BoxSizer(wx.HORIZONTAL)
  13.             self.Gauge = wx.Gauge(Panel_Gauge, range=Total, size=(520,25))
  14.             Gauge_BoxSizer.Add(self.Gauge, proportion=1, flag=wx.ALIGN_CENTER)
  15.             gauge = self.Gauge
  16.             Listado = self.Lista
  17.             self.ComprobarPuertos = self.CajaPuertos.GetValue()
  18.             self.ComprobarPuertos = self.ComprobarPuertos.split(" ")
  19.             COMPPUERTOS = self.ComprobarPuertos
  20.             prueba = Soket(Incremento, IncNums, Total, ComprobarIP, gauge, Listado, COMPPUERTOS)
  21.             prueba.start()

Bueno la palabra "hola" jajaja es sólo para probar si el programa es capaz de escribir algún texto en el ListCtrl.
Bueno amigos espero que me ayuden por favor.
Les agradezco, muchas gracias!!
Buena suerte!! Nos vemos!
  #4 (permalink)  
Antiguo 13/03/2014, 15:09
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 2 meses
Puntos: 35
Respuesta: Problema con ventana wxPython, se traba al comprobar conexiones sockets

Hola de nuevo. Me parece que un tu clase Socket deberías reemplazar la funcion run() en lugar de lalas(), que es la que se va a llamar cuando uses prueba.start(). Tambien podes probar esto:

Código Python:
Ver original
  1. prueba = Soket(Incremento, IncNums, Total, ComprobarIP, gauge, Listado, COMPPUERTOS)
  2. prueba.start()
  3. print("Funciona!")

Si rapidamente ves el mensaje "Funciona!" en consola, entonces quiere decir que funciona Sino, tu clase esta bloqueando la ejecucion de todo el programa, por ende se bloquea la GUI.

  #5 (permalink)  
Antiguo 13/03/2014, 15:37
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con ventana wxPython, se traba al comprobar conexiones sockets

He probado cambiando el nombre de la función a run y lo mismo se sigue clavando, también probé de poner el print("Funciona!") y tampoco sale en el momento, es como que no se puede salir de clase de la ventana porque al presionar el botón Escanear!, el mismo se queda clavado y la flecha del mause se convierte en un circulo, como que el programa esta trabajando pero no me salen los msjs "hola" en el ListCtrl ni tampoco sale el Funciona!, en realidad si salen, pero despues de que el programa termina de escanear todos los puertos, por lo tanto ahí salen de golpe todos los msjs "hola" en el ListCtrl y/o la ventana de "Funciona" (ya que al usar print se abre una pequeña ventana blanca para mostrar textos, esta ventana es aparte del programa).
Debería existir alguna forma de que esto no suceda, tan sólo son conexiones que van comprobando diferentes puertos y encima son ascendentes, osea que primero escanea un puerto y comprueba que el puerto esté abierto o cerrado, cuando lo comprueba recién pasa a escanear el otro puerto, osea no los escanea a todos juntos.
Que desilución :(
Python es tan bueno, rápido y avanzado para ser un programa interpretado y no debería pasar esto.
¿Que otra solucion tengo amigo carbon?
Gracias nuevamente!

PD: Lo raro es que la ventana de los print funcionan en el acto, es decir que en vez de escribir el msj "hola" en el programa, lo haría con print y ahí si sale en el momento siendo que también el print usa una ventana aparte de la mía. Que en realidad sería equivalente a usar threads.
  #6 (permalink)  
Antiguo 13/03/2014, 17:52
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 2 meses
Puntos: 35
Respuesta: Problema con ventana wxPython, se traba al comprobar conexiones sockets

El problema no es Python, sin ofender, creo que lo estas implementando mal. En lugar de usar la clase proba llamando directamente a threading.Thread(target=lalas).start(). El tema es que no tengo wxPython instalado y tampoco tu codigo completo como para experimentar un poco a ver donde esta el problema . Pero evidentemente eso esta bloqueando tu interfaz.
  #7 (permalink)  
Antiguo 13/03/2014, 18:22
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con ventana wxPython, se traba al comprobar conexiones sockets

Cita:
El problema no es Python, sin ofender, creo que lo estas implementando mal.
Si tienes razón, yo soy un novato en Python y me encanta este lenguaje, pero pienso que tal vez esto que quiero hacer no sea posible ya que he leído en algunas páginas que en Python algunas cosas no se pueden hacer y que en C o C++ si, de hecho toda la interfaz del programa está hecha en C++.

Cita:
En lugar de usar la clase proba llamando directamente a threading.Thread(target=lalas).start().
Aunque lo había probado anteriormente, lo he vuelto hacer y se sigue clavando, ya probé un montón de métodos de todas formas y no logro que se puedan separar esos procesos y trabajen independientemente, así no trabe la ventana.

Cita:
El tema es que no tengo wxPython instalado y tampoco tu codigo completo como para experimentar un poco a ver donde esta el problema . Pero evidentemente eso esta bloqueando tu interfaz.
Si es muy probable que algo está mal, algo estoy haciendo mal por eso no funciona, ya te pasé el código por MP
Gracias nuevamente!! y aguante Python!!!
  #8 (permalink)  
Antiguo 13/03/2014, 18:32
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con ventana wxPython, se traba al comprobar conexiones sockets

Intenté enviartelo por MP pero es muy largo, no me dejó el sistema.
Por favor enviame un MP con tu mail así te lo envío a tu mail, disculpen que no lo publique aquí pero me ha costado hacerlo al programa, además quiero que se conserve el autor una vez compilado a .exe
Gracias.
  #9 (permalink)  
Antiguo 13/03/2014, 18:55
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 2 meses
Puntos: 35
Respuesta: Problema con ventana wxPython, se traba al comprobar conexiones sockets

Entiendo perfectamente que no quieras publicar tu código, es totalmente logico y no hay nada de malo con ello . Por eso, antes de que me pases el codigo intentemos ver que anda mal. Intenta esto:

Código Python:
Ver original
  1. class Soket(threading.Thread):
  2.     def __init__(self, Incremento, IncNums, Total, ComprobarIP, gauge, Listado, COMPPUERTOS):
  3.         threading.Thread.__init__(self)
  4.         self.INCREMENTO = Incremento
  5.         self.INCNUMS = IncNums
  6.         self.TOTAL = Total
  7.         self.COMPROBARIP = ComprobarIP
  8.         self.BarraProgreso = gauge
  9.         self.Listado = Listado
  10.         self.PUERTOS = COMPPUERTOS
  11.    
  12.     def run(self):
  13.         if self.INCREMENTO < self.TOTAL:
  14.             try:
  15.                 self.puertito = int(self.PUERTOS[self.INCREMENTO])
  16.                 Conexion = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  17.                 Conexion.connect((self.COMPROBARIP, self.puertito))
  18.                 #print "Puerto abierto"
  19.                 self.INCREMENTO += 1
  20.                 self.INCNUMS += 1
  21.                 Conexion.close()
  22.                 self.Listado.InsertStringItem(0, "hola")
  23.                 self.Listado.SetStringItem(0, 1, "hola")
  24.                 self.Listado.SetStringItem(0, 2, "hola")
  25.                 self.Listado.SetStringItem(0, 3, "hola")
  26.                 self.run()
  27.             except:
  28.                 self.puertito = int(self.PUERTOS[self.INCREMENTO])
  29.                 #print "Puerto cerrado"
  30.                 self.INCREMENTO += 1
  31.                 self.INCNUMS += 1
  32.                 self.Listado.InsertStringItem(0, "hola")
  33.                 self.Listado.SetStringItem(0, 1, "hola")
  34.                 self.Listado.SetStringItem(0, 2, "hola")
  35.                 self.Listado.SetStringItem(0, 3, "hola")
  36.                 self.run()

Y la otra parte como lo mostraste en tu primer post. En __init__ estabas llamado a la función lalas(), error! Creo que definitivamente era eso, ya que la función start() se encarga de mover a run() a un nuevo hilo y ejecutarla ahi.

Fijate si funciona ahora y me dices.

  #10 (permalink)  
Antiguo 13/03/2014, 19:49
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con ventana wxPython, se traba al comprobar conexiones sockets

Seeeeeeeee, excelente!!! ahora si funciona perfecto!!!!!!
El programa sigue trabajando normal y ahora si me lista los puertos abiertos y los cerrados sin ningún problema ni tampoco se clava.
Muchísimas gracias amigo carbon, como siempre un placer estar con personas como vos que ayudan los demás.
Me alegro que Python haya podido hacer eso, así está mucho mejor!!!
Muchas gracias nuevamente amigo, que Dios te ilumine!!
Hasta pronto y éxitos!!
  #11 (permalink)  
Antiguo 14/03/2014, 15:06
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 2 meses
Puntos: 35
Respuesta: Problema con ventana wxPython, se traba al comprobar conexiones sockets

Excelente! Me alegro, saludos y larga vida a Python!
  #12 (permalink)  
Antiguo 14/03/2014, 23:20
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema con ventana wxPython, se traba al comprobar conexiones sockets

Gracias amigo carbon, muy gentil!!!
Un abrazo!

Etiquetas: conexiones, ip, programa, sockets, traba, ventana, wxpython
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:02.