Seite 1 von 1

table.attach 2 childs übergeben.

Verfasst: Montag 16. Juli 2018, 13:31
von Krumnix
Hallo.

Ich würde gerne in eine gtk.table 2 unterschiedliche childs übergeben.

Code: Alles auswählen

myTableTC3.attachToCell(plcImage(plcSymbol=PLC_STAT_PLC_POS_ACTIVE  %i, imageTrue=ICON_GREEN,    imageFalse=ICON_GRAY), col=1,row=4, xpadding=xpadding, ypadding=ypadding)
Würde ich gerne so umsetzen, dass "plcSymbol" 2x übergeben wird, sprich in der Zelle dann 2 Einträge sind.

Jemand einen Tipp?

Re: table.attach 2 childs übergeben.

Verfasst: Montag 16. Juli 2018, 13:47
von __blackjack__
@Krumnix: Das sieht irgendwie nicht nach Gtk aus. Gtk verwendet beispielsweise auch die in Python übliche Namensschreibweise, also klein_mit_unterstrichen für alles ausser Klassen (MixedCase) und Konstanten (KOMPLETT_GROSSBUCHSTABEN). Eine `attach_to_cell()`-Methode gibt es bei `Gtk.Table` nicht. Die Klasse ist zu dem „deprecated“ und man sollte `Gtk.Grid` stattdessen verwenden.

`my` ist ein unsinniger Namenspräfix. Was soll der denn hier bedeuten?

Re: table.attach 2 childs übergeben.

Verfasst: Montag 16. Juli 2018, 14:28
von Krumnix
Das ist aus einer Steuerung im Maschinenbau. Der Steuerungsbauer bietet Python an, um Masken zu beschreiben und zu animieren.
Die Class attachToCell basiert auf GTK.

Code: Alles auswählen

class table(gtk.Table):
    """
    This class returns a simple gtk.Table.

    Parameter see gtk.Table

    """
    instanceCounter = 0
    def __init__(self,rows=1, columns=1, homogeneous=False):
        #print 'INFO %s.%s() [%s]' %(type(self).__name__, sys._getframe().f_code.co_name, table.instanceCounter)
        table.instanceCounter += 1
        gtk.Table.__init__(self, rows=rows, columns=columns, homogeneous=homogeneous)

    def __del__(self):
        """ destructor """
        #print 'INFO %s.%s() [%s]' %(type(self).__name__, sys._getframe().f_code.co_name, table.instanceCounter)
        table.instanceCounter -= 1

    def attachToCell (self, child, col, row, xoptions = gtk.FILL, yoptions = gtk.SHRINK, xpadding = 0, ypadding = 0, xalign = 0):
        """
        Attach the child into a specified cell
        """
        try: child.set_property( 'xalign' , xalign )
        except: pass

        left_attach    = col
        right_attach   = col + 1
        top_attach     = row
        bottom_attach  = row + 1
        self.attach(child, left_attach, right_attach, top_attach, bottom_attach, xoptions=xoptions, yoptions=yoptions, xpadding=xpadding, ypadding=ypadding)

        self.show_all( )
self.attach(child <- da möchte ich hin, dass ich hier mehrere childs vom Typ plcimage übergeben kann....

Re: table.attach 2 childs übergeben.

Verfasst: Montag 16. Juli 2018, 15:08
von __blackjack__
`attachToCell` ist keine Klasse sondern eine Methode. Klassen geben auch nichts zurück wie im DocString der Klasse behauptet wird.

`__del__()` ist *kein* Destruktor und Python garantiert weder wann oder ob diese Methode überhaupt aufgerufen wird. Dagegen kann die blosse Existenz unter bestimmten Umständen zu Speicherlecks führen. Es gibt nur sehr wenige Gründe diese Methode überhaupt zu implementieren und wenn dann sollte man sich gut mit der Speicherverwaltung von Python auskennen.

Man sollte kein nackte ``except:`` ohne konkrete Ausnahme(n) verwenden. Schon gar nicht wenn man die Ausnahmebehandlung dann einfach nur aus einem ``pass`` besteht. ``pass`` würde ich an der Stelle auch immer kommentieren, damit man erkennt das es a) Absicht war da nichts zu tun und b) vielleicht auch den Grund erfährt warum es okay ist die Ausnahmen an der Stelle einfach zu ignorieren und so weiter zu machen als sei nichts passiert.

Mehrere Widgets pro Zelle geht nicht. Der andere Weg geht ja schon, mehrere Zellen für das Widget. Du kannst natürlich einen `gtk.Frame` erstellen, da rein stecken was Du möchtest und den dann in eine `gtk.Table`-Zelle stecken.

Re: table.attach 2 childs übergeben.

Verfasst: Montag 16. Juli 2018, 15:14
von Krumnix
Ja, deine Argumente sind soweit ok, aber an dieser "class" und ihren Methoden kann ich nix ändern : 8)
Ist vom Systemlieferant so vorgegebenen.

Die Idee mit einem Frame in eine Zelle zu stecken hab ich garnicht im Kopf gehabt.
Danke für den Tipp