Elemente in einem Grid oder einer Tabelle vertauschen

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
holgiul
User
Beiträge: 6
Registriert: Donnerstag 20. November 2014, 16:59

Donnerstag 20. November 2014, 17:16

Ich habe mit Glade eine Oberfläche erstellt. Es enthält u.a. ein Grid.
Je nach Startparameter sollen dort 2 Button vertauscht werden. Eigentlich ganz einfach - dachte ich.
Zum Testen habe ich das Programm auf ein Minimum vereinfacht:

Code: Alles auswählen

from gi.repository import Gtk, GObject
class Table:

    def __init__(self):
        self.wTree = Gtk.Builder()
        self.wTree.add_from_file("table.glade");
        self.wTree.connect_signals(self)
        self.window = self.wTree.get_object("window")
        tab = self.wTree.get_object('grid1')
        just = self.wTree.get_object('label1').get_justify()
        label = Gtk.Label('Test')
        label.set_justify(just)
        label.show()
        tab.attach(label, 0, 1, 1, 2)
        self.window.show_all()
        Gtk.main()

    def on_exit_clicked(self,widget):
        Gtk.main_quit()

    def on_change_clicked(self,widget):
        tab = self.wTree.get_object('grid1')
        l1  = self.wTree.get_object('label1')
        l2  = self.wTree.get_object('label2')
        tab.attach(l2, 0, 1, 0, 1)
        tab.attach(l1, 2, 3, 0, 1)

    def on_insert_clicked(self,widget):
        tab = self.wTree.get_object('grid1')
        l1  = self.wTree.get_object('label')
        tab.attach(l1, 1, 2, 1, 2)

Table()
Was funktioniert, ist dass das neue Label in Zeile 14 eingefügt wird. Jedoch ohne die gewünschte Ausrichtung eines bestehenden Labels.

Wenn ich aber über die Funktion on_insert_clicked einen Label einfügen will oder über on_change_clicked die Label tauschen möchte,
bekomme ich nur eine Fehlermeldung:

(table.py:8395): Gtk-CRITICAL **: gtk_grid_attach: assertion `gtk_widget_get_parent (child) == NULL' failed

Was mache ich falsch? Wo muss ich ansetzen?

Ach ja: Python 3.2.3 auf Debian
BlackJack

Donnerstag 20. November 2014, 17:32

@holgiul: Ein Widget kann nur einmal irgendwo hinzugefügt werden. Dann hat es ein `parent` und es kann eben nur *ein* `parent` haben. Das sagt die Fehlermeldung letztendlich auch aus. Du müsstest die Widgets die getauscht werden sollen also erst entfernen und dann wieder neu hinzufügen.
holgiul
User
Beiträge: 6
Registriert: Donnerstag 20. November 2014, 16:59

Donnerstag 20. November 2014, 17:38

Ahh, ok.

Aber, kann ich vlt. die Position überscheiben?

Code: Alles auswählen

<property name="left_attach">1</property>
<property name="right_attach">2</property>
BlackJack

Donnerstag 20. November 2014, 17:54

@holgiul: Ich weiss nicht was das XML jetzt soll, aber kann man die Elemente nicht aus dem `Grid`-Objekt entfernen und dann neu hinzufügen?
holgiul
User
Beiträge: 6
Registriert: Donnerstag 20. November 2014, 16:59

Donnerstag 20. November 2014, 18:03

Die Buttons werden ja durch Properties an das Grid gebunden.

Sicher kann man die Buttons zerstören und neu anlegen,
aber das ist doch um einiges aufwendiger.
Erzeugen, Konnektieren, Styles anbinden .....

Umpositionieren wäre einfach "schicker".
BlackJack

Donnerstag 20. November 2014, 18:30

@holgiul: Durch Properties? Ich glaube ja eher nicht, weder durch Python- noch Gtk-Properties. Zertören könnte man sie auch, aber man könnte sie doch vielleicht auch aus dem Grid entfernen und dann wieder hinzufügen. Ohne sie zu zerstören und neu zu erstellen.
holgiul
User
Beiträge: 6
Registriert: Donnerstag 20. November 2014, 16:59

Freitag 21. November 2014, 09:23

BlackJack hat geschrieben: aber man könnte sie doch vielleicht auch aus dem Grid entfernen und dann wieder hinzufügen.
Jaaa??? Das wäre das was ich mir vorstelle. :D

Den Button sichern:
button1 = self.wTree.get_object('button1')

Und wie ist das Gegegstück zu attach?
self.wTree.get_object('table1')......(button1)?!??
BlackJack

Freitag 21. November 2014, 13:51

@holgiul: Wenn man mal die Dokumentation liest stösst man auf die `remove()`-Methode:

Code: Alles auswählen

from gi.repository import Gtk


class Table(object):

    def __init__(self):
        self.window = Gtk.Window()
        self.window.connect('delete-event', Gtk.main_quit)
        self.grid = Gtk.Grid()
        self.window.add(self.grid)

        self.labels = [Gtk.Label('Test 1'), Gtk.Label('Test 2')]
        self._rearrange_labels(True)

        self.swap_button = Gtk.Button('Swap')
        self.swap_button.connect('clicked', self.do_swap)
        self.grid.attach(self.swap_button, 1, 0, 1, 2)

        self.window.show_all()

    def _rearrange_labels(self, first_run=False):
        if not first_run:
            for label in self.labels:
                self.grid.remove(label)
        for i, label in enumerate(self.labels):
            self.grid.attach(label, 0, i, 1, 1)

    def do_swap(self, _widget):
        self.labels.reverse()
        self._rearrange_labels()


def main():
    table = Table()
    Gtk.main()


if __name__ == '__main__':
    main()
holgiul
User
Beiträge: 6
Registriert: Donnerstag 20. November 2014, 16:59

Freitag 21. November 2014, 14:01

BlackJack hat geschrieben:Wenn man mal die Dokumentation liest stösst man auf die `remove()`-Methode:
ok?!?!!! Ist mir durch gegangen. :oops:

Werde ich später ausprobieren und das Ergebnis posten.

Danke für die tolle Unterstützung.
holgiul
User
Beiträge: 6
Registriert: Donnerstag 20. November 2014, 16:59

Freitag 21. November 2014, 17:47

Hi BlackJack,

das wars! :P
Ich kann die Buttons, die ich mit Glade erstellt habe, in einer Variablen zwischenspeichern, entfernen und wieder einfügen.

Danke. :o
Antworten