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.
Metadata
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 | Provenance | Actions |
|---|---|---|---|---|
| RangeSlider-2023.7.2.tar.gz | 14.6 kB | Without provenance | Details for RangeSlider-2023.7.2.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| RangeSlider-2023.7.2-py3-none-any.whl | Python 3 | none | any | Details for RangeSlider-2023.7.2-py3-none-any.whl |
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
|
Security for RangeSlider 2023.7.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.