scrolled panel

Plattformunabhängige GUIs mit wxWidgets.
Antworten
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hallo,

Ich möchte gerne dem Nutzer etwas Text in einem scrolled panel anbieten, aber meine bisherige Variante produziert nur am linken Rand des Fensters etwas Text und der Rest ist einfach grau. Weiß jemand wo der Fehler steckt?

Code: Alles auswählen

import wx.lib.scrolledpanel 

class SScrolledPanel(wx.lib.scrolledpanel.ScrolledPanel):
    """
        dummy class serving VersionHistoryWindow
    """
    def __init__(self, parent, frame, text):
        scrolled = wx.lib.scrolledpanel.ScrolledPanel.__init__(self, parent, -1)
    
        panel = wx.lib.scrolledpanel.ScrolledPanel(self, -1, size=wx.DefaultSize, style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER )
        sizer = wx.FlexGridSizer(cols=3, vgap=4, hgap=4)
        for line in text.split('\t'):
            sizer.Add(wx.StaticText(self, -1, line))
        panel.SetSizer(sizer)
        panel.SetAutoLayout(1)
        panel.SetupScrolling(1)

class VersionHistoryWindow(wx.Frame):
    """
        scrolled panel in order to show the version history
    """
    def __init__(self, parent, id, titel, text, pos=wx.DefaultPosition,
                            size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE):
        wx.Frame.__init__(self, parent, id, titel, pos, size, style)
        panel = SScrolledPanel(self, parent, text)

        border=wx.BoxSizer(wx.VERTICAL)
        border.Add(panel,-1, wx.FIXED_MINSIZE)
        border.Fit(self)
        self.SetSizer(border)
        self.Layout()
        self.Fit()

class SAXS_wx(wx.Frame):
...
    def OnHistory(self, event=None):
        """
            opens a little dialog to present the user the version history
        """
        win = VersionHistoryWindow(self, -1, "Version History", text = __revision__)
        win.Show(True)

class SAXSApp(wx.App):
    def OnInit(self):
        frame = SAXS_wx(None,-1,"SAXS Analysis")
        frame.Show(True)
        self.SetTopWindow(frame)
        return True
Gruß,
Christian
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

SScrolledPanel.__init__() ist völlig verkehrt. Es müsste z.B. so aussehen:

Code: Alles auswählen

    def __init__(self, parent, text):
        wx.lib.scrolledpanel.ScrolledPanel.__init__(self, parent, -1)
        sizer = wx.FlexGridSizer(cols=3, vgap=4, hgap=4)
        for line in text.split('\t'):
            sizer.Add(wx.StaticText(self, -1, line))
        sizer.Fit(self)
        self.SetSizer(sizer)
        self.SetAutoLayout(1)
        self.SetupScrolling(1)
Was die Zeilen 28 bis 33 sollen, verstehe ich nicht ganz. Wozu brauchst Du denn einen BoxSizer, wenn er sowieso nur ein Element enthält. Kommentier die Zeilen einmal aus! Verhält es sich dann so, wie Du Dir es vorstellst?
Wenn Du den BoxSizer behalten willst, musst Du die Größe des ScrolledPanels anpassen: Vor Zeile 15 sizer.Fit(self) eingeben.
Zeile 48 und die Kombination Zeile 30 und 33 dürften unnötig sein.
MfG
HWK
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi HWK,

vielen Dank. Inzwischen klappt es.
Zu Deiner Kritik: Na ja, das habe ich natürlich aus einer größeren Applikation - die ansonsten reibungslos funktioniert - herauskopiert und hier fürs Forum angepasst. Du hast recht, den BoxSizer hätte ich auch weglassen können, aber mein Frame hat schon noch zwei Elemente mehr drin und ich habe den Code nicht ausreichend eingedampft.

Dankeschön,
Christian
Antworten