wx panel scrollbar?

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Neu111
User
Beiträge: 48
Registriert: Dienstag 10. März 2020, 19:02

Dienstag 5. Januar 2021, 16:13

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.)
Benutzeravatar
__blackjack__
User
Beiträge: 7831
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Dienstag 5. Januar 2021, 17:35

Du suchst `wx.lib.scrolledpanel.ScrolledPanel`‽
“There's also a certain pleasure in actually getting things to work in Java, somewhat like the pleasure, I imagine, of building ships in bottles.”
— David Cook in c.l.p
Neu111
User
Beiträge: 48
Registriert: Dienstag 10. März 2020, 19:02

Dienstag 5. Januar 2021, 20:36

__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.
Benutzeravatar
__blackjack__
User
Beiträge: 7831
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Dienstag 5. Januar 2021, 21:24

@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.
“There's also a certain pleasure in actually getting things to work in Java, somewhat like the pleasure, I imagine, of building ships in bottles.”
— David Cook in c.l.p
Neu111
User
Beiträge: 48
Registriert: Dienstag 10. März 2020, 19:02

Mittwoch 6. Januar 2021, 09:50

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'"
Neu111
User
Beiträge: 48
Registriert: Dienstag 10. März 2020, 19:02

Mittwoch 6. Januar 2021, 10:38

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?
Benutzeravatar
__blackjack__
User
Beiträge: 7831
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mittwoch 6. Januar 2021, 11:53

@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.
“There's also a certain pleasure in actually getting things to work in Java, somewhat like the pleasure, I imagine, of building ships in bottles.”
— David Cook in c.l.p
Antworten