Seite 1 von 1

GUI wird zeitversetzt aktualisiert

Verfasst: Donnerstag 21. März 2013, 18:48
von atarax
Python 3, GTK+ 3

Hallo! Wenn man bei folgendem Skript auf den 'Los geht’s!'-Button klickt, vergeht erst eine Sekunde (time.sleep(1)), bevor das GUI aktualisiert wird, also erst nach dem Durchlauf der Schleife. Wie kann ich erreichen, dass das bereits zu Beginn der Schleife geschieht? Vielen Dank!

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

from gi.repository import Gtk, GObject
import time

class MainWindow(Gtk.Window):

    def __init__(self):
      
        Gtk.Window.__init__(self)
        self.set_position(Gtk.WindowPosition.CENTER)

        self.grid01 = Gtk.Grid()
        self.add(self.grid01)

        self.label01 = Gtk.Label("-")
        self.grid01.attach(self.label01, 0, 0, 1, 1)

        self.button01 = Gtk.Button(label="Los geht’s!")
        self.button01.connect('clicked', self.on_button01_clicked)
        self.grid01.attach(self.button01, 0, 1, 1, 1)
        
        self.show_all()

    def on_button01_clicked(self, widget):
        task = self.loop(widget)
        GObject.idle_add(task.__next__)

    def loop(self, widget):
        for i in range(0, 11):
            self.label01.set_text(str(i))
            time.sleep(1)
            yield True
        self.label01.set_text("-")
        yield False

win = MainWindow()
win.connect("delete-event", Gtk.main_quit)
Gtk.main()

Re: GUI wird zeitversetzt aktualisiert

Verfasst: Freitag 22. März 2013, 05:02
von diesch
Für vor dem sleep()-Aufruf ein:

Code: Alles auswählen

while Gtk.events_pending():
    Gtk.main_iteration ()

Re: GUI wird zeitversetzt aktualisiert

Verfasst: Freitag 22. März 2013, 10:12
von Barabbas
Bei solchen Sachen kann man ganz gut mit einem Timeout arbeiten, der bspw. alle 500ms (oder weniger) das Label aktualisiert. Hier ist die GTK2-Variante, gibt es sicher auch noch in GTK3: http://www.pygtk.org/pygtk2reference/go ... imeout-add :)

Sleeps willst du in deiner GUI in aller Regel nicht verwenden, das Ding soll ja responsive bleiben. Und selbst wenn du verhindern möchtest, dass der Nutzer nebenbei noch was machen kann, wäre vll. eher ein Modal-Dialog das Mittel der Wahl und nicht ein Sleep :).