Foros del Web » Programando para Internet » Python »

Duda sobre destruir ventanas - Pygtk

Estas en el tema de Duda sobre destruir ventanas - Pygtk en el foro de Python en Foros del Web. Estoy desarrollando una pequeña aplicacion para la bandeja del sistema y el problema que tengo es que al darle boton derecho al icono y darle ...
  #1 (permalink)  
Antiguo 24/01/2011, 18:13
 
Fecha de Ingreso: julio-2010
Mensajes: 7
Antigüedad: 13 años, 9 meses
Puntos: 0
Duda sobre destruir ventanas - Pygtk

Estoy desarrollando una pequeña aplicacion para la bandeja del sistema y el problema que tengo es que al darle boton derecho al icono y darle por ejemplo a "Preferencias" y salir la ventana para hacer todo eso, despues de que se cierre si quiero volver a abrirla me sale una ventana sin nada dentro.

Tambien me pasa con el dialogo de "Acerca de" que trae Glade.

Aqui dejo un trozo del codigo a ver si me podes ayudar. Gracias

Código:
   def on_preferencias_destroy(self, widget, data=None):
		self.preferencias.destroy()
		
   def on_guardar_credenciales_clicked(self,widget, data=None):
	   usuario = self.usuario_en.get_text()
	   clave = self.clave_en.get_text()
	   datos = [usuario + "\n", clave]
	   if OS != "win32": 
		   os.chdir(os.environ['HOME'])
		   f = open (".resanator.conf", "w")
		   f.writelines(datos)
	   else:
		   f = open ("resanator.txt", "w")
		   linea = f.writelines(datos)
	   f.close()
	   self.preferencias.destroy()
	
   def on_preferencias_activate(self, widget, data=None):
	   self.preferencias.show()
  #2 (permalink)  
Antiguo 25/01/2011, 06:35
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Duda sobre destruir ventanas - Pygtk

Pues no he usado Gtk, pero si destruís la ventana me parece que el objeto que la representa ya no está disponible (fue destruido también) y deberías crear uno nuevo.

Siempre con los sistemas de ventanas tenés dos opciones: dejar el objeto en memoria y manejar la ventana con .show() / .hide(), o destruirlo y crearlo cada vez que quieras ocultar / mostrar la ventana.


saludos.
  #3 (permalink)  
Antiguo 25/01/2011, 07:58
 
Fecha de Ingreso: julio-2010
Mensajes: 7
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Duda sobre destruir ventanas - Pygtk

Cita:
Iniciado por AlvaroG Ver Mensaje
Pues no he usado Gtk, pero si destruís la ventana me parece que el objeto que la representa ya no está disponible (fue destruido también) y deberías crear uno nuevo.

Siempre con los sistemas de ventanas tenés dos opciones: dejar el objeto en memoria y manejar la ventana con .show() / .hide(), o destruirlo y crearlo cada vez que quieras ocultar / mostrar la ventana.


saludos.
Probe a poner hide() en vez de destroy() pero me sigue haciendo lo mismo. Funciona la primera vez pero a la segunda ya falla. Vuelve a salir la ventana pero sin nada dentro
  #4 (permalink)  
Antiguo 25/01/2011, 10:23
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Duda sobre destruir ventanas - Pygtk

Cambia show por show_all para hacer visible también los widgets que están dentro de la ventana.
  #5 (permalink)  
Antiguo 25/01/2011, 15:04
 
Fecha de Ingreso: julio-2010
Mensajes: 7
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Duda sobre destruir ventanas - Pygtk

Cita:
Iniciado por razpeitia Ver Mensaje
Cambia show por show_all para hacer visible también los widgets que están dentro de la ventana.

No hay manera, pongo el codigo completo por si el problema esta en otra parte.

Código:
#!/usr/bin/env python

import pygtk
import gtk, gobject
import os, sys
import urllib2
import time
import threading, thread
from twill.commands import go, fv, submit

OS = sys.platform
stop = 0

if OS != "win32":
    # UNIX
    gtk.gdk.threads_init()
else:
    # Windows
    gobject.threads_init()

class icono:
   def __init__(self):
      builder = gtk.Builder()
      if OS != "win32":
        builder.add_from_file("/usr/share/resanator/resanator-gui.glade")
      else:
        os.chdir("C:\\resanator")
        builder.add_from_file("resanator-gui.glade")
      self.iconobandeja = builder.get_object("iconobandeja")
      self.menu = builder.get_object("menu")
      self.acerca = builder.get_object("acerca")
      self.preferencias = builder.get_object("preferencias")
      self.usuario_en = builder.get_object("usuario_en")
      self.clave_en = builder.get_object("clave_en")
      self.guardar_credenciales = builder.get_object("guardar_credenciales")

      builder.connect_signals(self)
      
   def on_iconobandeja_activate(self, widget, data=None):
      self.acerca.show()
      
   def on_preferencias_destroy(self, widget, data=None):
		self.preferencias.destroy()
		
   def on_guardar_credenciales_clicked(self,widget, data=None):
	   usuario = self.usuario_en.get_text()
	   clave = self.clave_en.get_text()
	   datos = [usuario + "\n", clave]
	   if OS != "win32": 
		   os.chdir(os.environ['HOME'])
		   f = open (".resanator.conf", "w")
		   f.writelines(datos)
	   else:
		   f = open ("resanator.txt", "w")
		   linea = f.writelines(datos)
	   f.close()
	   self.preferencias.destroy()
	
   def on_preferencias_activate(self, widget, data=None):
	   self.preferencias.show_all()
	      
   def on_acerca_close(self, widget, data=None):
	   self.acerca.hide()  #No funciona
   
   def on_iconobandeja_popup_menu(self, widget, button, activate_time): 
      self.menu.popup(None, None, None, button, activate_time)

   def on_ejecutar_activate(self, widget, data=None):
		try:
			if OS != "win32":  
				os.chdir(os.environ['HOME'])
				f = open (".resanator.conf", "r")
				for index in range(2):
					linea = f.next()
					if index != 1:
						usuario = linea
						usuario = usuario [:-1]
					else:
						clave = linea	
						print usuario
						print clave
			else:
				f = open ("resanator.txt", "r")
				for index in range(2):
					linea = f.next()
					if index != 1:
						usuario = linea
						usuario = usuario [:-1]
					else:
						clave = linea
						
			f.close()
			threading.Thread(target=self.ejecutar, args=(stop,usuario,clave,)).start()
		except:
			self.preferencias.show_all()
	
   
   def on_salir_activate(self, widget, data=None): 
      pid = os.getpid()
      os.kill(pid, 15)

      

   def ejecutar(self,stop,usuario,clave):
	
	if stop == 0:
		while 1:
			go('https://172.16.0.1:8090/corporate/webpages/httpclientlogin.jsp?loginstatus=null&logoutstatus=null&message=null&liverequesttime=null&livemessage=null&$')

			try:
				fv("1", "username", usuario)
				fv("1", "password", clave)
		
				submit('0')
			except urllib2.HTTPError, e:
				sys.exit("%d: %s" % (e.code, e.msg))
			except IOError, e:
				print e
			except:
				pass
			time.sleep(240)
	if stop == 1:
		print stop
		

if __name__ == "__main__":  
	icono()
	gtk.main()
  #6 (permalink)  
Antiguo 25/01/2011, 20:47
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Duda sobre destruir ventanas - Pygtk

pues seguís teniendo algunos self.preferencias.destroy() sin estar creando de nuevo la ventana, por lo que es claro que seguirás teniendo problemas.


Saludos.
  #7 (permalink)  
Antiguo 28/01/2011, 13:31
 
Fecha de Ingreso: julio-2010
Mensajes: 7
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Duda sobre destruir ventanas - Pygtk

Cita:
Iniciado por AlvaroG Ver Mensaje
pues seguís teniendo algunos self.preferencias.destroy() sin estar creando de nuevo la ventana, por lo que es claro que seguirás teniendo problemas.


Saludos.
Oh perdon, no me habia dado cuenta. Ahora ya funciona si le doy al boton de aceptar, en ese caso puedo volver a ver esa ventana siempre que quiera, pero si le doy a la X me pasa lo de antes.

Etiquetas: pygtk, ventanas
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 14:44.