Gtk zeichnet erst nach Funktionsbearbeitung

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Diego Brei
User
Beiträge: 8
Registriert: Dienstag 4. Februar 2014, 21:40

Ich will in einer Handlerfunktion das Aussehen eines Widgets verändern (im Beispiel ein Radiobutton). Wie es scheint, wartet Gtk mit der Darstellung der Veränderung, bis die Funktion abgearbeitet ist, sie soll jedoch unmittelbar dargestellt werden. (Das Beispiel hat wenig Sinn, ist nur zur Illustration)

Code: Alles auswählen

from gi.repository import Gtk
import time

class ToggleButtonWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="ToggleButton Demo")
        self.set_border_width(10)

        hbox = Gtk.Box(spacing=6)
        self.add(hbox)

        self.button1 = Gtk.RadioButton.new_with_label_from_widget(None, "Button 1")
        self.button1.connect("toggled", self.on_button_toggled)
        hbox.pack_start(self.button1, False, False, 0)

        self.button2 = Gtk.RadioButton.new_from_widget(self.button1)
        self.button2.set_label("Button 2")
        self.button2.connect("toggled", self.on_button_toggled)
        hbox.pack_start(self.button2, False, False, 0)

    def on_button_toggled(self, button):
        self.button2.set_active(True)
        time.sleep(2.0)

win = ToggleButtonWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
Zu Beginn der Funktion on_button_toggled() wird der zweite, nicht aktive Radiobutton aktiv gesetzt und anschließend 2 Sekunden gewartet. Angezeigt wird die Veränderung allerdings erst NACH den 2 Sekunden. Hat jemand ne Idee, wie man Gtk dazu bringen kann, die Änderung sofort umzusetzen?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Diego Brei hat geschrieben:Hat jemand ne Idee, wie man Gtk dazu bringen kann, die Änderung sofort umzusetzen?
Die Änderung wird sofort durchgeführt. Jedoch blockiert die GUI, und damit auch die Aktualisierung aller Widgets, so lange, bis die Funktion abgearbeitet ist. So funktionnieren GUIs nun einmal. Wenn du das nicht möchtest, dann musst du deine Berechnung in einen Thread auslagern. Was ist denn dein eigentliches Problem?
Das Leben ist wie ein Tennisball.
Benutzeravatar
diesch
User
Beiträge: 80
Registriert: Dienstag 14. April 2009, 13:36
Wohnort: Brandenburg a.d. Havel
Kontaktdaten:

Rufe nach der Veränderung

Code: Alles auswählen

while Gtk.events_pending():
      Gtk.main_iteration ()
auf.
http://www.florian-diesch.de
Diego Brei
User
Beiträge: 8
Registriert: Dienstag 4. Februar 2014, 21:40

Super, funktioniert!
Vielen Dank
Antworten