# Segmenting the Slider browsing

• posted
0

Currently, I have a slider that I segmented into three pieces (as demonstrated below). Does anyone have an alternative method or style of achieving the same or similar result?

In the past I asked about converting a degree into a compass direction and loved all the different ideas. (Helps me learn quite a bit and is inspiring)

``````def slider(self, sender):
myInt = sender.value/3
if myInt < .1:
sender.value = 0
if myInt >= .1:
sender.value = .5
if myInt >= .2:
sender.value = 1``````

• posted
0

Hi Dann,

Were you looking for 3 partitions of equal size or did you want partitions of different sizes? I will assume equal in the solution below.

Your variable myInt is not an integer but is instead a float.

For all myInt values equal to or larger than .2, the code above sets sender.value to .5 and then resets it to 1. In the end, you get the correct result but it is just slightly inefficient. You should consider use of `elif` and `else` to ensure that sender.value is only set once in the function for any input value.

To divide a contiguous range into three part, you should only need two compares instead of three if you judiciously use `elif` and `else`.

``````def slider(self, sender):
if sender.value < 1.0/3:      # 0.33333...
sender.value = 0
elif sender.value >= 2.0/3:  # 0.66666...
sender.value = 1
else:  # 0.33333... <= sender.value < 0.66666...
sender.value = .5
``````

• posted
0

Here's a one liner, that divides the slider into N equal steps.

``````    def slider(self,sender):
from math import floor
N=3  #number of steps
sender.value=min(floor(sender.value*N)/(N-1),1.0)
``````

(Edit, min added to ensure 1.0 stays in bounds)

• posted
0

Or without math:

``sender.value = 1 if sender.value >= 2./3 else .5 if sender.value >= 1./3 else 0``

Internal error.

Oops! Looks like something went wrong!