Python - Actualizar pantalla en un bucle

 
Vista:
sin imagen de perfil
Val: 6
Ha disminuido su posición en 19 puestos en Python (en relación al último mes)
Gráfica de Python

Actualizar pantalla en un bucle

Publicado por Pedro (3 intervenciones) el 27/07/2018 11:52:18
Python 3.4 Gtk Glade 3.18.3
Intento mostrar pot pantalla información cada x segundos, para ello tengo una pantalla creada en glade con etiquetas que muestran la información, guardada en archivos CSV..
El problema es refrescar la pantalla (window.show_all() ) no se ejecuta si no se sale del bucle (While True). i de la funcion.

No se como forzar el refresco de pantalla.

Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 6
Ha disminuido su posición en 19 puestos en Python (en relación al último mes)
Gráfica de Python

Actualizar pantalla en un bucle

Publicado por Pedro (3 intervenciones) el 27/07/2018 12:21:56
Para que se entienda un poco mas......

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/env Python34
# --*-- conding: utf-8 --*--
 
import gi
gi.require_version("Gtk","3.0")
import time
 
from gi.repository import GLib, Gtk, GObject
 
class AppMain():
    def __init__(self):
        self.win = Gtk.Window()
        self.win = Gtk.Window(default_height=300, default_width=300)
        self.win.connect("delete-event", Gtk.main_quit)
        self.label = Gtk.Label()
        self.win.add(self.label)
 
 
        self.win.show_all()
 
        for x in range(5):
            self.label.set_text(str(x))
            self.win.show_all()
             x = x + 1
             time.sleep(1)
 
 
if __name__ == "__main__":
    AppMain()
    Gtk.main()

No se muestra en la label del 0 al 3, la pantalla se abre ya con el label = 4, cuando el bucle for ha terminado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Sergio
Val: 32
Ha disminuido su posición en 4 puestos en Python (en relación al último mes)
Gráfica de Python

Actualizar pantalla en un bucle

Publicado por Sergio (11 intervenciones) el 27/07/2018 21:38:07
Eso pasa porque lo estás haciendo en el __init__() (constructor)

por ende primero se inicializa con el constructor y luego muestra la ventana, ese comportamiento hace que ya esté terminado el bucle cuando se abre la GUI.


Tendrás que ponerlo en una función aparte y cuando estés mostrando el form mandar a llamar el método.

Enlace de interés para tu problema.
https://stackoverflow.com/questions/10919659/execute-a-function-after-calling-gtk-main
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil
Val: 6
Ha disminuido su posición en 19 puestos en Python (en relación al último mes)
Gráfica de Python

Actualizar pantalla en un bucle

Publicado por Pedro (3 intervenciones) el 30/07/2018 13:53:15
Hola Sergio, gracias por la rapidez en contestar.
No conocia ---> while Gtk.events_pending(): Gtk.main_iteration()

Despues de tus consejos y leer algunos ejemplos por intenet, funciona correctamente, Dejo el codigo corregido:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/env Python34
# --*-- conding: utf-8 --*--
 
import gi
gi.require_version("Gtk","3.0")
import time
 
from gi.repository import GLib, Gtk, GObject
 
class AppMain():
    def __init__(self):
        self.win = Gtk.Window()
        self.win = Gtk.Window(default_height=300, default_width=300)
        self.win.connect("delete-event", Gtk.main_quit)
        self.label = Gtk.Label()
        self.label.set_text("Inicio")
        self.win.add(self.label)
 
        self.win.show_all()
        act_label(self)
 
def act_label(self):
    for x in range(5):
        while Gtk.events_pending():
            Gtk.main_iteration()
        self.label.set_text(str(x))
        self.win.show_all()
        x = x + 1
        time.sleep(1)
 
 
if __name__ == "__main__":
    AppMain()
    Gtk.main()
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar