RangeSlider 2023.07.2
Range selection widget for Python Tkinter GUI developement in slider widget structure with two handles.
Updates and Fixes in v2023.07.2 w.r.t v2023.07.1
- Updated: Documentation, included padX and padY in widget calls to avoid confusion with errors. However, the values needs to be updated in case of non-suitability depending on system and used font size, handle size etc.
- Added: Sample ipython notebook containing code. (Visit: https://github.com/harshvinay752/RangeSlider/blob/1a068138c63ca61ccc734e71c27201e7a851c65a/sample.ipynb)
Updates and Fixes in v2023.07.1 w.r.t v2022.12.1
- Fixed: Error in updation of UI in absence of step markers.
- Fixed: Error in initialisation of handle values. (Closing the issue: https://github.com/harshvinay752/RangeSlider/issues/7#issue-1806570927)
- Added: Complimentary check for correct [step_size] parameter in case of usage of step markers.
- Fixed: Updated example code in documentation.
Updates and Fixes in v2022.12.1 w.r.t. v2021.7.4
- Added option to change font color of label (Merged from: https://github.com/RWitak)
- Improved and added option to set initial value of handles. (Merged from: https://github.com/sebasj13)
Note: In order to set the initial values -- declare initial value to the handle variable, if undeclared both handles will be set to min_val. See example in Usage section.
- Added option to set step size. (Closing the issue: https://github.com/harshvinay752/RangeSlider/issues/4#issue-1451264874)
- Added option to display step points on the bar, with added color option.
- Added option to (dis)allow the handles to cross each other.
- Added option to force(or set) handle value. (Both by value or normalised position). (Closing the issue: https://github.com/harshvinay752/RangeSlider/issues/1#issue-1050521371)
Features:
- Range selection
- Vertical as well as horizontal widget
- Option for showing current value of handle
- Customizable handle with default circular handle offering color choice or using image as handle
- Ability to bind a tkinter variable, making it easier to check for slider movement
- Custom font and position for value text
- Customizable value precision
- Custom suffix option
- Many others...
Preview
[preview.png] image file in repository.
Usage
Importing required sliders
For horizontal RangeSlider:
from RangeSlider.RangeSlider import RangeSliderH
For vertical RangeSlider:
from RangeSlider.RangeSlider import RangeSliderV
For both horizontal and vertical RangeSlider:
from RangeSlider.RangeSlider import RangeSliderH, RangeSliderV
Creating Simple RangeSlider widget:
from tkinter.ttk import *
import tkinter as tk
root = tk.Tk()
hLeft = tk.DoubleVar(value = 0.2) #left handle variable initialised to value 0.2
hRight = tk.DoubleVar(value = 0.85) #right handle variable initialised to value 0.85
hSlider = RangeSliderH( root , [hLeft, hRight] , padX = 12) #horizontal slider, [padX] value might be needed to be different depending on system, font and handle size. Usually [padX] = 12 serves,
#otherwise a recommended value will be shown through an error message
hSlider.pack() # or grid or place method could be used
vBottom = tk.DoubleVar(value = 0) #bottom handle variable
vTop = tk.DoubleVar(value = 1) #top handle variable
vSlider = RangeSliderV( root, [vBottom, vTop] , padY = 12) #vertical slider, [padY] value might be needed to be different depending on system, font and handle size. Usually [padY] = 12 serves,
#otherwise a recommended value will be shown through an error message
vSlider.pack() # or grid or place method could be used
root.mainloop()
Getting current value
print ( hSlider.getValues() ) #return type list of format [ left handle value, right handle value ]
print ( vSlider.getValues() ) #return type list of format [ bottom handle value, top handle value ]
Force value
hSlider.forceValues([0.2, 0.67]) #returns None
vSlider.forceValues([0.62, 0.85]) #returns None
Callback on value change
def doSomething():
print ('I was called.')
hLeft.trace_add('w', doSomething)
hRight.trace_add('w', doSomething)
vBottom.trace_add('w', doSomething)
vTop.trace_add('w', doSomething)
Attributes
For RangeSliderH:
| Attribute | Default Value | Acceptable Value(s) or Description | Release Comment |
|---|---|---|---|
| master | N/A | parent like Tk instance, TopLevel, or Frame etc. | v2021.7.4 |
| variables | N/A | list of DoubleVar of length two in order of left handle and right handle | v2021.7.4 |
| Width | 400 | width of widget in px | v2021.7.4 |
| Height | 80 | height of widget in px | v2021.7.4 |
| min_val | 0 | minimum value | v2021.7.4 |
| max_val | 1 | maximum value | v2021.7.4 |
| padX | 3 | padding from both left and right in px | v2021.7.4 |
| image_anchorR | CENTER | anchor value for right handle if image is used as handle - N, NE, E, SE, S, SW, W, NW, CENTER | v2021.7.4 |
| image_anchorL | CENTER | anchor value for left handle if image is used as handle - N, NE, E, SE, S, SW, W, NW, CENTER | v2021.7.4 |
| imageL | None | PhotoImage instance for imaged left handle | v2021.7.4 |
| imageR | None | PhotoImage instance for imaged right handle | v2021.7.4 |
| auto | True | True for automatic circular colored handle, False for imaged handle | v2021.7.4 |
| line_width | 3 | width of widget track in px | v2021.7.4 |
| bar_radius | 10 | radius of outer circle of handle | v2021.7.4 |
| bar_color_inner | '#5c8a8a' | hex value of color for inner circle in string format | v2021.7.4 |
| bar_color_outer | '#c2d6d6' | hex value of color for inner circle in string format | v2021.7.4 |
| line_s_color | '#0a50ff' | hex value of color for selected portion for widget track in string format | v2021.7.4 |
| line_color | '#476b6b' | hex value of color for unselected portion for widget track in string format | v2021.7.4 |
| bgColor | '#ffffff' | hex value of color for background of widget in string format | v2021.7.4 |
| step_marker_color | '#ffffff' | hex value of color in string format for steps marked on widget bar | v2022.12.1 |
| font_color | '#000000' | hex value of color for font of widget in string format | v2022.12.1 |
| show_value | True | True if current value of handle are intended; otherwise False | v2021.7.4 |
| digit_precision | '.1f' | precision format for shown value | v2021.7.4 |
| valueSide | 'TOP' | 'TOP' if shown value intended above the handle or 'BOTTOM' if shown value intended below the handle | v2021.7.4 |
| font_family | 'Times' | font family ( all font families supported by tkinter are acceptable ) | v2021.7.4 |
| font_size | 16 | font size in pt | v2021.7.4 |
| suffix | "" | suffix for shown value | v2021.7.4 |
| step_size | 0 | step size of handle movement, step_size equal to 0 implies continuous movement subject to system architecture floating point resolution | v2022.12.1 |
| step_marker | False | True if to display step markers on bar; otherwise False | v2022.12.1 |
| cross_each_other | False | True if handles can cross each other | v2022.12.1 |
For RangeSliderV:
| Attribute | Default Value | Acceptable Value(s) | Release Comment |
|---|---|---|---|
| master | N/A | parent like Tk instance, TopLevel, or Frame etc. | v2021.7.4 |
| variables | N/A | list of DoubleVar of length two in order of lower handle and upper handle | v2021.7.4 |
| Width | 80 | width of widget in px | v2021.7.4 |
| Height | 400 | height of widget in px | v2021.7.4 |
| min_val | 0 | minimum value | v2021.7.4 |
| max_val | 1 | maximum value | v2021.7.4 |
| padY | 3 | padding from both top and bottom in px | v2021.7.4 |
| image_anchorU | CENTER | anchor value for upper handle if image is used as handle - N, NE, E, SE, S, SW, W, NW, CENTER | v2021.7.4 |
| image_anchorL | CENTER | anchor value for lower handle if image is used as handle - N, NE, E, SE, S, SW, W, NW, CENTER | v2021.7.4 |
| imageL | None | PhotoImage instance for imaged lower handle | v2021.7.4 |
| imageU | None | PhotoImage instance for imaged upper handle | v2021.7.4 |
| auto | True | True for automatic circular colored handle, False for imaged handle | v2021.7.4 |
| line_width | 3 | width of widget track in px | v2021.7.4 |
| bar_radius | 10 | radius of outer circle of handle | v2021.7.4 |
| bar_color_inner | '#5c8a8a' | hex value of color for inner circle in string format | v2021.7.4 |
| bar_color_outer | '#c2d6d6' | hex value of color for inner circle in string format | v2021.7.4 |
| line_s_color | '#0a50ff' | hex value of color for selected portion for widget track in string format | v2021.7.4 |
| line_color | '#476b6b' | hex value of color for unselected portion for widget track in string format | v2021.7.4 |
| bgColor | '#ffffff' | hex value of color for background of widget in string format | v2021.7.4 |
| step_marker_color | '#ffffff' | hex value of color in string format for steps marked on widget bar | v2022.12.1 |
| font_color | '#000000' | hex value of color for font of widget in string format | v2022.12.1 |
| show_value | True | True if current value of handle are intended; otherwise False | v2021.7.4 |
| digit_precision | '.1f' | precision format for shown value | v2021.7.4 |
| valueSide | 'TOP' | 'TOP' if shown value intended above the handle or 'BOTTOM' if shown value intended below the handle | v2021.7.4 |
| font_family | 'Times' | font family ( all font families supported by tkinter are acceptable ) | v2021.7.4 |
| font_size | 16 | font size in pt | v2021.7.4 |
| suffix | "" | suffix for shown value | v2021.7.4 |
| step_size | 0 | step size of handle movement, step_size equal to 0 implies continuous movement subject to system architecture floating point resolution | v2022.12.1 |
| step_marker | False | True if to display step markers on bar; otherwise False | v2022.12.1 |
| cross_each_other | False | True if handles can cross each other | v2022.12.1 |
Additional Notes for attributes
- if show_value is False, digit_precision, valueSide, font_family, font_size and suffix have no effect
- if auto is True, imageL, imageU, image_anchorL, image_anchorR and image_anchorU have no effect
- if auto is False, bar_radius, bar_color_inner, bar_color_outer have no effect
- if step_size is zero, step_marker will not be made
Exceptions raised
| Condition | Exception |
|---|---|
| if auto is True and either imageL or imageU or imageR or combination out of three is also given | Exception raised: "Can't decide if to use auto shape or images!" |
| if auto is False and one of the image handles is missing | Exception raised: "Handle for one image missing." |
| if auto is False and dimensions for both handles provided are not same | Exception raised : "Image dimensions incompatible, both handles should have same height and width respectively." |
| if Width or Height or padX or padY are not sufficient to render the widget with all features visible safely | Exception raised : $dimension$ not suitable with suggestions to avoid it |
Functions
| Function | Arguments | Output Format |
|---|---|---|
| getValues() | NIL | value of handle variables in list format in the same order as given in object definition, returned values lie between min_val and max_val |
| getPos() | NIL | normalised value of handle variables in list format in the same order as given in object definition, returned values lie between 0 and 1 |
| forceValues(values) | values : a list of two values each indicating value of handle, values must be between min_val and max_val | return None |
| forcePos(pos) | pos : a list of two normalised values each indicating value of handle, values must be between 0 and 1 | return None |
Note: The relation between value ($v_i$) and normalised value ($n_i$) of $i^{th}$ handle defined for a slider with max_val of $v_<$ and min_val of $v_>$ is given by:
$\begin{equation} n_i = \frac{v_i - v_>}{v_<-v_>} \end{equation}$
Words of Developer
This is the second version of this library. It is one of its kind widget for tkinter. When I was developing a tool for my college project I found that at the time no inbuilt or external tool is available for tkinter allowing range selection. However, range selection is a high demand tool specially for applications dealing with data visualizations. I would appreciate any developer from any community who wants to contribute to this project.
I thank RWitak and Sebastian for contributing to this project.
Release files for RangeSlider 2023.7.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| RangeSlider-2023.7.2.tar.gz | 14.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| RangeSlider-2023.7.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 24.9 kB
Release files / RangeSlider-2023.7.2.tar.gz
| Download URL | RangeSlider-2023.7.2.tar.gz |
|---|---|
| Size | 14.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6ad39340b0a848dc516d0ac9e8796951c4fb295511717ac67d56694566660f9d
|
|
BLAKE2b-256 checksum How to use checksums |
47fd460e4c9282d43520cd740abd2312a446b6e57e54c974b57c02d03f0fd544
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.8.0 colorama/0.4.4 importlib-metadata/4.6.4 keyring/21.7.0 pkginfo/1.8.2 readme-renderer/40.0 requests-toolbelt/0.9.1 requests/2.25.1 rfc3986/1.5.0 tqdm/4.64.0 urllib3/1.26.0 CPython/3.10.6
|
Release files / RangeSlider-2023.7.2-py3-none-any.whl
| Download URL | RangeSlider-2023.7.2-py3-none-any.whl |
|---|---|
| Size | 10.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2b7aa56438452e70ce3e011d7aad7f4dc8b90fab63b37720b6e0dbd3f3a09ba6
|
|
BLAKE2b-256 checksum How to use checksums |
5560a2e25e323adda95ee5937fb0f0d6d552d632e9de8ac0b10637445a929466
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.8.0 colorama/0.4.4 importlib-metadata/4.6.4 keyring/21.7.0 pkginfo/1.8.2 readme-renderer/40.0 requests-toolbelt/0.9.1 requests/2.25.1 rfc3986/1.5.0 tqdm/4.64.0 urllib3/1.26.0 CPython/3.10.6
|