Seite 1 von 1

wx panel scrollbar?

Verfasst: Dienstag 5. Januar 2021, 16:13
von Neu111
Hallo,
ich suche nach einer einfachen Möglichkeit, um ein Panel scrollbar zu machen (soll heißen: wenn der Inhalt des Panels die maximale Höhe überschreitet, soll eine Scrollbar erscheinen).
Hat jemand eine Idee?
Mein Grundgerüst sieht wie folgt aus:

Code: Alles auswählen

...
self.main = wx.Panel(self)
self.links = wx.Panel(self.main, -1, pos=(0,0), size=(100,200))
self.rechts = wx.Panel(self.main, -1, pos=(100,0), size=(100,200))
...
Wie kann ich self.rechts scrollbar machen?

Beim googeln habe ich nichts passendes gefunden (nur teils komplexe Klassen mit Boxsizer usw.)

Re: wx panel scrollbar?

Verfasst: Dienstag 5. Januar 2021, 17:35
von __blackjack__
Du suchst `wx.lib.scrolledpanel.ScrolledPanel`‽

Re: wx panel scrollbar?

Verfasst: Dienstag 5. Januar 2021, 20:36
von Neu111
__blackjack__ hat geschrieben:
Dienstag 5. Januar 2021, 17:35
Du suchst `wx.lib.scrolledpanel.ScrolledPanel`‽
Beim googeln bin ich natürlich auch auf wx.lib.scrolledpanel.ScrolledPanel gestoßen.
Das Thema ist mir aber zu kompliziert.
Der erste Google-Treffer verweist mir auf https://wxpython.org/Phoenix/docs/html/ ... panel.html
Und dort ist auch ein Beispiel-Code hinterlegt:

Code: Alles auswählen

text = '''
ScrolledPanel extends wx.ScrolledWindow, adding all
the necessary bits to set up scroll handling for you.

Here are three fixed size examples of its use. The
demo panel for this sample is also using it -- the
wx.StaticLine below is intentionally made too long so a scrollbar will be
activated.'''

import wx
import wx.lib.scrolledpanel as scrolled

class TestPanel(scrolled.ScrolledPanel):

    def __init__(self, parent):

        scrolled.ScrolledPanel.__init__(self, parent, -1)

        vbox = wx.BoxSizer(wx.VERTICAL)

        desc = wx.StaticText(self, -1, text)

        desc.SetForegroundColour("Blue")
        vbox.Add(desc, 0, wx.ALIGN_LEFT | wx.ALL, 5)
        vbox.Add(wx.StaticLine(self, -1, size=(1024, -1)), 0, wx.ALL, 5)
        vbox.Add((20, 20))

        self.SetSizer(vbox)
        self.SetupScrolling()


app = wx.App(0)
frame = wx.Frame(None, wx.ID_ANY)
fa = TestPanel(frame)
frame.Show()
app.MainLoop()
Wegen einer Scrollbar so ein umfangreiches Klassen-Konstrukt?
Das kann doch eigentlich nicht sein.

Re: wx panel scrollbar?

Verfasst: Dienstag 5. Januar 2021, 21:24
von __blackjack__
@Neu111: Welches *umfangreiche* Klassenkonstrukt denn bitte? Und nein natürlich muss man davon nicht erben, aber wenn Du das nicht siehst, und die handvoll einfachen Code da zu umfangreich findest, dann ist GUI-Programmierung an sich wohl (noch) nichts für Dich.

Re: wx panel scrollbar?

Verfasst: Mittwoch 6. Januar 2021, 09:50
von Neu111
Meine Klasse ist wie folgt aufgebaut:

Code: Alles auswählen

class TestPanel(wx.Frame):

    def __init__(self, parent, title):

D.h. es wird in der Klasse TestPanel bereits eine andere Klasse (wx.Frame) vererbt.
Da Mehrfachvererbung kein Problem darstellen sollte, war mein Lösungsansatz folgender:

Code: Alles auswählen

class TestPanel(wx.Frame, scrolled.ScrolledPanel):

    def __init__(self, parent, title):

Wenn ich nun aber ein Objekt erzeugen möchte, erscheint die Fehlermeldung "super(TestPanel, self).__init__(parent, title=title, ..... __init__() got an unexpected keyword argument 'title'"

Re: wx panel scrollbar?

Verfasst: Mittwoch 6. Januar 2021, 10:38
von Neu111
Mich beschäftigt eine weitere Frage:
Im Internet findet man zu wx.lib.scrolledpanel zwar viele Beispiele, jedoch sind diese Beispiele immer mit "wx.BoxSizer .... self.SetSizer .... self.SetupScrolling()" gekoppelt.
Ist BoxSizer eine absolute Bedingung, damit scrolledpanel überhaupt funktioniert?

Re: wx panel scrollbar?

Verfasst: Mittwoch 6. Januar 2021, 11:53
von __blackjack__
@Neu111: Man kann nicht einfach von beliebigen Klassen erben, insbesondere nicht von zwei Widgetklassen. Mehrfachvererbung *ist* ein Problem. Darum wird das auch nur sehr selten gemacht und mit Klassen die dafür vorgesehen sind zusammen als Basisklassen verwendet zu werden.

Du kannst auch einen anderen Sizer als `BoxSizer` verwenden. Ich sehe gerade das Du im ersten Beitrag absolute Posiitionen (und Grössen) verwendest: das macht man nicht. Nicht mal im Spass. Verwende Sizer.