Scrollbar für Listbox

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
DHK
User
Beiträge: 26
Registriert: Sonntag 18. März 2007, 14:55
Wohnort: Bayern

Hallo,
ich habe in einem Skript folgende ListBox:

Code: Alles auswählen

#...
installed_skins = ['Nuvola', 'Test', 'Test2', 'Test3', 'Test4', 'Test5', 'Test6', 'Test7', 'Test8', 'Test9', 'Test10', 'Test11', 'Test12', 'Test13']
#...
wx.ListBox(self, 15, (10,60), (200, 200), installed_skins, style=wx.LB_SORT)
Ich hatte eigentlich erwartet, dass bei zu vielen Einträgen eine Scrollbar erzeugt wird. Wie ihr hier sehen könnt, werden nur die Einträge bis 'Test9' angezeigt. Keine Scrollbar, nix. Wie kriege ich also eine Scrollbar, damit auch die restlichen Einträge von installed_skins angezeigt werden?

Gruß

DHK
Opera ist noch immer der beste...
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Sobald die ListBox zuwenig Platz hat um alle Items darzustellen, wird ein Scrollbalken erstellt, da jetzt jedoch alle Elemente angezeigt werden können brauchts keine.

Gruss
Benutzeravatar
DHK
User
Beiträge: 26
Registriert: Sonntag 18. März 2007, 14:55
Wohnort: Bayern

Hallo rayo,
ich glaube du hast es falsch verstanden. In installed_skins befinden sich Einträge bis 'Test13'. In der ListBox werden aber nur Einträge bis 'Test9' angezeigt, wie man auch hier (Klick mich) sehen kann. Eine Scrollbar wird leider nicht erzeugt, obwohl ich eine will.

Gruß

DHK
Opera ist noch immer der beste...
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Ich seh aber alle Einträge, nur in der falschen Reihenfolge

Gruss
Benutzeravatar
DHK
User
Beiträge: 26
Registriert: Sonntag 18. März 2007, 14:55
Wohnort: Bayern

Oh, Entschuldigung, mir fällt gerade auf, dass Test10 - Test13 tatsächlich auf dem Screen sind...
Nun ja, dann gilt es nur noch das Problem mit der umgekehrten Reihenfolge zu lösen. Ich nehme an, das liegt an der Sortierweise von Python:
1
10
11
12
2
21
22
23
etc.

Wie kann ich denn diese Sortierweise umgehen?

Gruß

DHK
Opera ist noch immer der beste...
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Das liegt an der normalen Sortierung der Strings, Test10 ist kleiner als Test2. Wenn du die Originalsortierung haben willst, lass style=wx.LB_SORT weg.

Gruss
Benutzeravatar
DHK
User
Beiträge: 26
Registriert: Sonntag 18. März 2007, 14:55
Wohnort: Bayern

Hallo,
vielen Dank für deinen Tipp.
Ich habe jetzt noch eine Frage zu einem anderen Thema. Wie kann ich in wxPython ein Element löschen? Also z. B. habe ich einen Button:

Code: Alles auswählen

testus = wx.Button(self, -1, 'Als neuen Skin wählen', (220, laenge))
Wenn der User jetzt auf einen anderen Button klickt, möchte ich, dass der oben genannte Button gelöscht wird. Wie geht sowas? Hab schon ein bisschen im Forum und auf der wxPython-Seite geguckt und nichts ähnliches wie delete() oder unset() (kenne ich aus anderen Sprachen) gefunden.

Gruß

DHK
Opera ist noch immer der beste...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

DHK hat geschrieben:Wie kann ich in wxPython ein Element löschen? Also z. B. habe ich einen Button:

Code: Alles auswählen

testus = wx.Button(self, -1, 'Als neuen Skin wählen', (220, laenge))
Hi DHK!

Mit ``mybutton.Destroy()``. Aber vorher musst du den Button aus dem Sizer raus nehmen, in den du ihn evt. gelegt hast.

``mysizer.Detach()`` oder in einem Rutsch mit ``mysizer.Remove()``.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
DHK
User
Beiträge: 26
Registriert: Sonntag 18. März 2007, 14:55
Wohnort: Bayern

Hallo gerold,
vielen Dank für den Tipp. Ich habe trotzdem noch eine Frage. Ich habe folgendes Skript:

Code: Alles auswählen

# ...
isset = 0
# ...
self.Bind(wx.EVT_LISTBOX, self.OnSelect, id=15)
def OnSelect(self, event):
        if isset == 1:
            testus.Destroy()
            isset = 0
        # ....
        testus = wx.Button(self, -1, 'Als neuen Skin wählen', (220, laenge))
        isset = 1

Als Ausgabe erhalte ich immer:
Traceback (most recent call last):
File "E:\Eigene Dateien\Programme\Testprogramm\helloworld.py", line 35, in OnSelect
if isset == 1:
UnboundLocalError: local variable 'isset' referenced before assignment


Weißt du, was ich da falsch gemacht habe?

Gruß

DHK
Opera ist noch immer der beste...
Benutzeravatar
DHK
User
Beiträge: 26
Registriert: Sonntag 18. März 2007, 14:55
Wohnort: Bayern

Konnte das Problem selbst lösen:

Code: Alles auswählen

# ...
isset = 0
# ...
self.Bind(wx.EVT_LISTBOX, self.OnSelect, id=15)
def OnSelect(self, event):
        global isset
        global testus
        if isset == 1:
            testus.Destroy()
            isset = 0
        # ....
        testus = wx.Button(self, -1, 'Als neuen Skin wählen', (220, laenge))
        isset = 1
Gruß

DHK
Opera ist noch immer der beste...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

DHK hat geschrieben:

Code: Alles auswählen

# ...
isset = 0
# ...
self.Bind(wx.EVT_LISTBOX, self.OnSelect, id=15)
def OnSelect(self, event):
        global isset
        global testus
        if isset == 1:
            testus.Destroy()
            isset = 0
        # ....
        testus = wx.Button(self, -1, 'Als neuen Skin wählen', (220, laenge))
        isset = 1
Hi DHK!

Mal im Ernst: Wenn du für so etwas schon ``global`` einsetzen musst, dann wirst du in der GUI-Programmierung nicht weit kommen. Verwende Variablen, die an die Frame-Klasseninstanz gebunden sind.

Dieses Beispiel soll nur aufzeigen, wie du mit Instanzvariablen (self.xxx) arbeiten könntest.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import wx

wx.SetDefaultPyEncoding("iso-8859-1")


class MyFrame(wx.Frame):
    
    def __init__(
        self, parent = None, id = -1, title = "Example", size = wx.Size(550, 420)
    ):
        
        wx.Frame.__init__(self, parent, id, title, size = size)
        
        panel = wx.Panel(self)
        
        vbox_main = wx.BoxSizer(wx.VERTICAL)
        panel.SetSizer(vbox_main)
        
        # Spreizer (vbox_main)
        vbox_main.Add((0, 0), 1)
        
        # Durch die Spreizer in der vertikalen Mitte zentrierter, 
        # horizontaler wx.BoxSizer
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        vbox_main.Add(hbox, 0, wx.EXPAND | wx.ALL, 5)
        self.hbox = hbox # Variable an Klasseninstanz binden
        
        # Button 1
        button1 = wx.Button(panel, -1, u"Button 1")
        hbox.Add(button1, 0, wx.ALL, 5)
        self.button1 = button1 # Variable an Klasseninstanz binden
        button1.Bind(wx.EVT_BUTTON, self.on_button_click)
        
        # Spreizer (hbox); damit werden die Buttons nach aussen gedrückt
        hbox.Add((0, 0), 1)
        
        button2 = wx.Button(panel, -1, u"Button 2")
        hbox.Add(button2, 0, wx.ALL, 5)
        self.button2 = button2 # Variable an Klasseninstanz binden
        button2.Bind(wx.EVT_BUTTON, self.on_button_click)
        
        # Spreizer (vbox_main)
        vbox_main.Add((0, 0), 1)
    
    
    def on_button_click(self, event):
        """
        Eventhandler, der den angeklickten Button entfernt
        """
        
        button = event.GetEventObject()
        
        if button is self.button1:
            self.hbox.Detach(self.button1)
            self.button1.Destroy()
        else:
            self.hbox.Detach(self.button2)
            self.button2.Destroy()


def main():
    """Testing"""
    
    app = wx.PySimpleApp()
    f = MyFrame()
    f.Center()
    f.Show()
    app.MainLoop()


if __name__ == "__main__":
    main()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
DHK
User
Beiträge: 26
Registriert: Sonntag 18. März 2007, 14:55
Wohnort: Bayern

Hallo gerold,
vielen Dank für den Tipp. Werde ich mir merken.

Gruß

DHK
Opera ist noch immer der beste...
Antworten