Seite 1 von 1

Elemente in einem Grid oder einer Tabelle vertauschen

Verfasst: Donnerstag 20. November 2014, 17:16
von holgiul
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

Re: Elemente in einem Grid oder einer Tabelle vertauschen

Verfasst: Donnerstag 20. November 2014, 17:32
von BlackJack
@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.

Re: Elemente in einem Grid oder einer Tabelle vertauschen

Verfasst: Donnerstag 20. November 2014, 17:38
von holgiul
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>

Re: Elemente in einem Grid oder einer Tabelle vertauschen

Verfasst: Donnerstag 20. November 2014, 17:54
von BlackJack
@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?

Re: Elemente in einem Grid oder einer Tabelle vertauschen

Verfasst: Donnerstag 20. November 2014, 18:03
von holgiul
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".

Re: Elemente in einem Grid oder einer Tabelle vertauschen

Verfasst: Donnerstag 20. November 2014, 18:30
von BlackJack
@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.

Re: Elemente in einem Grid oder einer Tabelle vertauschen

Verfasst: Freitag 21. November 2014, 09:23
von holgiul
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)?!??

Re: Elemente in einem Grid oder einer Tabelle vertauschen

Verfasst: Freitag 21. November 2014, 13:51
von BlackJack
@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()

Re: Elemente in einem Grid oder einer Tabelle vertauschen

Verfasst: Freitag 21. November 2014, 14:01
von holgiul
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.

Re: Elemente in einem Grid oder einer Tabelle vertauschen

Verfasst: Freitag 21. November 2014, 17:47
von holgiul
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