Sizer & growable col => Button wird zwei Mal gezeichnet

Plattformunabhängige GUIs mit wxWidgets.
Antworten
WienerSchnitzel
User
Beiträge: 10
Registriert: Freitag 23. November 2012, 18:41

Hallo,

ich habe einen GridBagSizer und möchte gerne, dass ein Button immer auf der rechten Seite liegt. Dazu habe ich eine Spalte eingefügt, die expandieren kann. Wenn die Spalte nicht expandieren kann, wird wie erwartet der Button links in der zweiten Spalte gezeichnet. Anderenfalls wird der Button zwei Mal gezeichnet! Einmal in in der rechten Spalte (da wo der Button sein soll) und das zweite Mal in der linken Spalte, die eigentlich leer sein sollte!

Hier ein Beispiel:

Code: Alles auswählen

self._sizer = wx.GridBagSizer(hgap=10, vgap=5)
self._sizer.AddGrowableCol(1)
sizer_buttons = wx.BoxSizer(wx.VERTICAL)
sizer_buttons.Add (wx.Button(self, label = "test", size = (100, 30)), border=10)
self._sizer.Add (sizer_buttons, pos=(0,2), border=10)

self.SetAutoLayout(True)
self.SetSizer(self._sizer)
self.Layout()
Könnt ihr mir sagen, wo der Fehler liegt?
Zuletzt geändert von Anonymous am Samstag 4. Mai 2013, 13:46, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@WienerSchnitzel: Ich kann das Problem nicht nachvollziehen. Hier wird nur eine Schaltfläche dargestellt:

Code: Alles auswählen

import wx


class TestFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent)
        sizer = wx.GridBagSizer(hgap=10, vgap=5)
        sizer.AddGrowableCol(1)
        buttons_sizer = wx.BoxSizer(wx.VERTICAL)
        buttons_sizer.Add(wx.Button(self, label='test'))
        sizer.Add(buttons_sizer, pos=(0, 2))
        self.SetAutoLayout(True)
        self.SetSizer(sizer)
        self.Layout()


def main():
    app = wx.PySimpleApp()
    frame = TestFrame(None)
    frame.Show()
    app.MainLoop()


if __name__ == '__main__':
    main()
Von den absoluten Grössen solltest Du übrigens Abstand nehmen. Die Grösse einer Schaltfläche sollte vom Inhalt abhängen und nicht von Pixelangaben, die sich nicht an den Inhalt anpassen.
WienerSchnitzel
User
Beiträge: 10
Registriert: Freitag 23. November 2012, 18:41

Danke für deine Antwort. Merkwüdigerweise wurde meine Methode, wenn ich die erste Spalte expandieren lasse, zweimal aufgerufen und damit zwei Buttons erstellt. Ich speicher nun meine Objekte ab und prüfe, ob solche schon existieren. So kann ich indirekt das Problem umschiffen (auch wenn ich das immer noch nicht richtig verstehe).
BlackJack

@WienerSchnitzel: Ist das denn eine besondere Methode? Oder rufst *Du* die mehrfach auf?
WienerSchnitzel
User
Beiträge: 10
Registriert: Freitag 23. November 2012, 18:41

Mit Methode meine ich Funktion (ich dachte, den Begriff gäbe es in Python auch). Du hast das in den Konstruktor geschrieben, ich in eine seperate Funktion meiner Klasse. Da dein Beispiel funktioniert, muss ich irgendwo einen Fehler machen/irgendwo unbewusst doppelt aufrufen. Aber das sollte ja nun nicht mehr so schwer herauszufinden sein.
BlackJack

@WienerSchnitzel: Es gibt in Python auch Funktionen, aber ``def``-Anweisungen auf Klassenebene erzeugen Methoden. Solange man nicht mit `classmethod()` oder `staticmethod()` etwas anderes daraus macht.
Antworten