wx.Slider Intervalle beim Ziehen mit der Maus

Plattformunabhängige GUIs mit wxWidgets.
Antworten
h3lium
User
Beiträge: 2
Registriert: Samstag 14. Mai 2011, 15:13

Hallo Leute,
ich habe einen wx.Slider erstellt und diesen mit slider.SetPageSize(5) und slider.SetLineSize(5) so eingestellt, dass beim ziehen bzw. klicken mit der Maus,
die Werte nicht in Intervallen von 1,2,3, etc. weiterschreiten sollten, sondern eben um 5er Schritte, d.h. 0, 5, 10, 15, etc.
Leider funktioniert das bei mir nicht. Es geht nur, wenn ich den Sliderwert mittels der Pfeiltasten auf dem Keyboard bediene. Mit der Maus fällt der Slider beim Ziehen im wieder zurück auf Einzelschritte, also 1,2,3, ... oder 3,2,1, ...

Ich möchte gerne Prozentangaben im Slider zulassen, die in 5er Schritten gesetzt werden sollen. D.h. das Programm dass ich schreibe verlangt, das nur Werte wie 15, 30, 100, 95, etc. gültig sind, nicht aber 34, 17, oder ähnlich "krumme" Zahlen.

So sieht mein aktueller Versuch aus, der aber nicht so arbeitet, wie ich möchte:

Code: Alles auswählen

slider = wx.Slider(self,style=wx.SL_LABELS | wx.SL_AUTOTICKS)
slider.SetPageSize(5)
slider.SetLineSize(5)
slider.SetTickFreq(5,1)

self.GetSizer().Add(slider)
Ich programmiere mit wx2.8 und python 2.6 unter Ubuntu 10.04, was aber eigentlich nicht wichtig sein sollte, oder?

Am einfachsten wäre es ja, wenn ich dem Slider einen Zahlenraum vorgeben könnte, z.B. über ein Tuple mit gewünschten Werten. Das geht wohl nicht oder?
Weiß hier jemand Rat, ob das, was ich möchte möglich ist und wie ich das gegebenefalls hinbekomme?

Ich habe mittlerweile auch schon nach wx.SpinCtrl geschaut, das aber die gleiche Beschränkung zu haben scheint. Wäre nett, wenn sich hier jemand zu meinem Wunsch bzw. Problem äußern könnte. Speziell zu meinem Thema konnte ich über SuFu nichts finden.

Gruß und vielen Dank,
h3lium
h3lium
User
Beiträge: 2
Registriert: Samstag 14. Mai 2011, 15:13

Immer schön, wenn man seine Problem selbst lösen kann... ;)

Für alle, die noch eine Lösung des oben dargelegten Problems suchen, hier mal ein Vorschlag.
Nachdem ich das http://wiki.wxwidgets.org/WxSlider_step_intervals gelesen habe, war klar, dass der Modulo Operator hier helfen kann.

Ich denke, es wäre viel eleganter, wenn wx.Slider oder wx.SpinCtrl eine Art Datenquelle übernehmen könnten, wie z.B. ein Tupel mit den Daten, die man vom Slider gerne widergespiegelt sehen würde. Wie auch immer, solange das (anscheinend) nicht geht, hier mal mein schneller (und hoffentlich nicht zu häßlicher) Ersatz.

Wann immer jemand einen wx.Slider benötigt, der auch mit der Maus zu ziehen ist und dann immer noch die Wert anzeigt, die man vom ihm erwartet, könnte man
folgendes machen:

1. Du brauchst natürlich einen wx.Slider (wx.SpinCtrl ginge aber auch)

Code: Alles auswählen

    self.slider = wx.Slider(self, style=wx.SL_LABELS | wx.SL_AUTOTICKS)
    self.slider.SetPageSize(5)
    self.slider.SetLineSize(5)
    self.slider.SetTickFreq(5,1)
2. Binde den Slider an einen Event handler, der immer dann aktiv wird, wenn sich der Wert des Sliders verändert.

Code: Alles auswählen

    self.slider.Bind(wx.EVT_SLIDER, self.OnSliderValueChanged)
3. Lass deinen Event handler auf das ungewüschte Maus/Slider-Verhalten reagieren.

Code: Alles auswählen

       
        def OnSliderValueChanged(self, event):
           
            current_value = self.slider.GetValue()
            remainder = current_value % 5
           
            if(remainder != 0):
                current_value -= remainder
                self.slider.SetValue(current_value)
Beachte, dass ich den Slider aus der ersten Nachricht geändert habe, so dass er nun an self. gebunden ist. Das habe ich gemacht, damit der Event handler Zugriff auf den aktuellen Wert des Sliders hat.

Hoffe, dass das jemandem helfen kann.

Gruß,
h3lium
Antworten