GUI wird zeitversetzt aktualisiert

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Benutzeravatar
atarax
User
Beiträge: 44
Registriert: Samstag 14. Juni 2008, 22:49
Wohnort: Berlin
Kontaktdaten:

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()
http://www.decocode.de/
Benutzeravatar
diesch
User
Beiträge: 80
Registriert: Dienstag 14. April 2009, 13:36
Wohnort: Brandenburg a.d. Havel
Kontaktdaten:

Für vor dem sleep()-Aufruf ein:

Code: Alles auswählen

while Gtk.events_pending():
    Gtk.main_iteration ()
http://www.florian-diesch.de
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

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 :).
Antworten