Turn on/off blinking label

170 views
Skip to first unread message

Dan Moormann

unread,
Nov 28, 2023, 12:12:07 AM11/28/23
to Kivy users support
I've got everything else working ok except I don't seem to be able to use a switch to change the blinking behavior on and off.
If I set anim.repeat=True   (or  False)  in BlinkingLabel() it works as expected but when I try to feed off the def blink_on_off() I get this error

   File "C:\Users\danm9\Crash\tutorial.kv", line 374, in <module>
     on_active: app.root.get_screen('Main').blink_on_off()
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\danm9\Crash\main.py", line 810, in blink_on_off
     self.ids.spot.anim.repeat=True
     ^^^^^^^^^^^^^^^^^^
   File "kivy\weakproxy.pyx", line 32, in kivy.weakproxy.WeakProxy.__getattr__
 AttributeError: 'BlinkingLabel' object has no attribute 'anim'

Once again, it's all about referencing.  
1. Is there a simple tutorial or documentation that covers referencing?
2. How do I reference ids.spot.anim.repeat.active ?

button_extra_behavior.py
linenum.py
crash100.png
tutorial.kv
main.py
crash101.png

elli...@cox.net

unread,
Nov 28, 2023, 9:07:54 AM11/28/23
to kivy-...@googlegroups.com

The good news is that you had the kivy referencing correct – this was more of a python issue.

 

    def blink_on_off(self):
        anim =
self.ids.spot.anim
       
if self.ids.blsw.active:
            anim.repeat =
False
        else
:
            anim.repeat =
True
           
anim.start(self.ids.spot)


class BlinkingLabel(Label):
   
def __init__(self, **kwargs):
       
super().__init__(**kwargs)
       
self.anim = Animation(color=[1, 1, 0, 0], duration=0.5) + \
               Animation(
color=[1, 1, 0, 1], duration=0.5)
       
self.anim.repeat = True
       
self.anim.start(self)

 

 

In the __init__() of BlinkingLabel, you had declared anim, not self.anim.   Without the “self.” anim is a local variable. self.anim is an instance variable.  For your use case you needed to declare self.anim.

 

I also made some minor changes to blink_on_off()

--
You received this message because you are subscribed to the Google Groups "Kivy users support" group.
To unsubscribe from this group and stop receiving emails from it, send an email to kivy-users+...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/kivy-users/63a94833-d953-4f4a-8f87-990c4710869cn%40googlegroups.com.

ElliotG

unread,
Nov 28, 2023, 7:58:27 PM11/28/23
to Kivy users support
Just another thought... You have made blink_on_off() a method of the screen.  It would make more sense for this to be a method of  BlinkingLabel.

Dan Moormann

unread,
Nov 28, 2023, 9:27:01 PM11/28/23
to Kivy users support
I tried moving blink_on_off under class BlinkingLabel, but got an error, so I moved it back.  If you meant something else, let me know.
By the way, everything is working fine - thanks.

Another question:
My intent was to be able to move the spot widget anywhere on the screen and have its position shown in hntx and vntx (pos_hint values).  I've got DragBehavior working but would like to combine BlinkingLabel and DragLabel into a single widget.  Is this possible?

I added the following:
from kivy.uix.behaviors import DragBehavior

class DragLabel(DragBehavior, Label):
println('class DragLabel')
pass

<DragLabel>:
# Define the properties for the DragLabel
drag_rectangle: self.x, self.y, self.width, self.height
drag_timeout: 10000000
drag_distance: 0

DragLabel:
id: drag
name: 'drag'
size_hint: 0.25, 0.2
text: 'Drag me'

elli...@cox.net

unread,
Nov 29, 2023, 8:53:34 AM11/29/23
to kivy-...@googlegroups.com

Glad to hear it is all working.  If you decide to move the biink_on_off() method to BlinkingLabel the code needs to be changed to work in that spot.  I suggest moving it because it is more naturally belongs in that class.   You could call it with the state of the switch, and then you would access anim as self.amim and the widget as self.  But it’s your code…

 

Yes, can create a new class to create a DragBlinkingLabel….  derive DragBlinkingLabel from just DragLabel and use the existing __init__().  The new class will inherit both the Label attributes and the DragBehaviors.

 

I don’t think you can combine the DragBehavior with pos_hint.  The pos_hint will prevent you from dragging the widget.  Instead set the initial position using pos.  You can use the widget data to write an expression to set the widgets initial position, but the pos will be updated by the drag.

elli...@cox.net

unread,
Nov 29, 2023, 9:24:30 AM11/29/23
to kivy-...@googlegroups.com

Here is an example… I tried using a pos_hint with the DragBlinkLabel and as I thought, the label will not drag… Note how pos was used to center the DragBlinkLabel in the center of the Layout.

 

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.uix.behaviors import DragBehavior
from kivy.animation import Animation

kv =
"""


<DragLabel>:
    # Define the properties for the DragLabel
    drag_rectangle: self.x, self.y, self.width, self.height
    drag_timeout: 10000000
    drag_distance: 0

<DragBlinkLabel>:
    text: 'drag me'
    size_hint: None, None
    size: self.texture_size

RelativeLayout:
    DragBlinkLabel:
        pos: self.parent.center_x - self.width / 2, self.parent.center_y
        id: drag_blink_label
    Switch:
        size_hint: None, None
        size: dp(100), dp(48)
        pos_hint: {'center_x': 0.5, 'y': 0}
        active: True  # set initial state
        on_active: drag_blink_label.blink_on_off(self.active)
"""


class DragLabel(DragBehavior, Label):
   
pass


class
DragBlinkLabel(DragLabel):
   
def __init__(self, **kwargs):
       
super().__init__(**kwargs)
       
self.anim = (Animation(color=[1, 1, 0, 0], duration=0.5) +
                     Animation(
color=[1, 1, 0, 1], duration=0.5))
       
self.anim.repeat = True
       
self.anim.start(self)

   
def blink_on_off(self, active):
       
if not active:
           
self.anim.repeat = False
        else
:
           
self.anim.repeat = True
           
self.anim.start(self)


class DragBlinkApp(App):
   
def build(self):
       
return Builder.load_string(kv)


DragBlinkApp().run()

Dan Moormann

unread,
Nov 29, 2023, 1:44:04 PM11/29/23
to Kivy users support
Let's take this one step at a time.  I tried to follow your example and totally messed everything up.  I want to use spot as my draggable, blinking widget.
If I move blink_on_off() to BlinkingLabel, I don't know how to reference it (once again I'm still struggling with referencing).  If I can get that to work, I can move on to trying to use your example.

Right now, spot is a BlinkingLabel along with most of my other widgets in <ScatterTextWidget> (Main) it is currently working with the slider stuff and the positioning labels and textinputs (lab2, txt2, txt3, hntx, vntx).  If I move things around in my kv file, how do I reference them if they're not in "Main'.

I saw how you used
        on_active: drag_blink_label.blink_on_off(self.active)

but was unable to replicate it in my code.

elli...@cox.net

unread,
Nov 29, 2023, 2:23:43 PM11/29/23
to kivy-...@googlegroups.com

In tutorial.kv


Switch: #switch for blink on/off
   
id: blsw
   
name: 'blsw'
   
text: 'No'
   
active: True # set to True to match initial state of blinking
   
size_hint: .14,.05
   
pos_hint: {'x':.735, 'y':.605}
   
on_active: spot.blink_on_off(self.active)

BlinkingLabel: 
#spot for position
   
id: spot
   
name: "spot"
   
text: '*'
   
font_size: 30
   
color: 1,1,0,1
   
background_color: 255,255,0,1
   
size_hint: None,None
   
size: 1,1
   
pos_hint: {'x':.2, 'y':.25}

 

And in python, added the blink_on_off from my example to the BlnkingLabel class.

 


class BlinkingLabel(Label):
   
def __init__(self, **kwargs):
       
super().__init__(**kwargs)
       
self.anim = Animation(color=[1, 1, 0, 0], duration=0.5) + \
               Animation(
color=[1, 1, 0, 1], duration=0.5)
       
self.anim.repeat = True
       
self.anim.start(self
)

   
def blink_on_off(self, active):
       
if not active:
           
self.anim.repeat = False
        else
:
           
self.anim.repeat = True
           
self.anim.start(self)
Message has been deleted

Dan Moormann

unread,
Nov 29, 2023, 8:20:17 PM11/29/23
to Kivy users support
I tried to post earlier, but it seems to have disappeared.  Oh well, let's try again.
I made the changes to my code based on your example (changed the widget names to be consistent).  Also changed the logic of blink_0n_off b y reversing from not active to active (easier on my brain).  I got everything working again, but a new problem.  I added the stuff for Drag and got the following error:

 kivy.lang.parser.ParserException: Parser: File "C:\Users\danm9\Crash\tutorial.kv", line 383:
 ...
     381:    size: self.texture_size
     382:
 >>  383:RelativeLayout:
     384:    Label:  #blink switch label
     385:        id: blla
 ...
 Only one root object is allowed by .kv

So, I commented out the RelativeLayout and I go this:

BuilderException: Parser: File "C:\Users\danm9\Crash\tutorial.kv", line 357:
 ...
     355:        size_hint: .05,.043
     356:        pos_hint: {'x':.77, 'y':.70}
 >>  357:        text: str('{:1.3}'.format(spot.pos[1]/600))
     358:
     359:    Label:
 ...
 NameError: name 'spot' is not defined
   File "C:\Users\danm9\Crash\venv\Lib\site-packages\kivy\lang\builder.py", line 240, in create_handler
     return eval(value, idmap), bound_list
            ^^^^^^^^^^^^^^^^^^
   File "C:\Users\danm9\Crash\tutorial.kv", line 357, in <module>
     text: str('{:1.3}'.format(spot.pos[1]/600))
                 ^^^^
It doesn't know where spot is and I have no idea how to reference it. (I moved it to <DragBlinkLabel> )

If you need a fresh copy of my code, let me know.

elli...@cox.net

unread,
Nov 29, 2023, 9:45:57 PM11/29/23
to kivy-...@googlegroups.com

In my example the RelativeLayout is the root widget.  That is why it is on the far left column of the file. 

As the error states, “only one root object is allowed by kv.” 

 

My example was just a simple example with a drag area and a switch.  You will need to work through how you want to integrate the elements.

 

Share you main.py and kv file if you get stuck.

Dan Moormann

unread,
Nov 29, 2023, 11:46:36 PM11/29/23
to Kivy users support
Got everything working but the DragBlinkLabel.  I commented out the related stuff.
Here's a fresh dump of my kv and py files. 

I still want to drag and blink the spot widget (in TutorialTextWidget)

tutorial.kv
main.py

elli...@cox.net

unread,
Nov 30, 2023, 11:04:57 AM11/30/23
to kivy-...@googlegroups.com

Here is the edit to kv:


    DragBlinkLabel: 
#spot for position
       
id: spot
       
name: "spot"
       
text: '*'
       
font_size: 30
       
color: 1,1,0,1
        
background_color: 255,255,0,1
       
size_hint: None,None
       
size: self.texture_size
        pos_hint
: {'x':.2, 'y':.25}
#        pos: root.right * .2, root.height * .25

 

And python:

class DragBlinkLabel(DragLabel):

 

There is an issue with the code where when dragging the spot, the mouse and the spot get farther away from each other.  I suspect the issue is 2 things are being changed at once.  Moving the spot changes the slider, and moving the slider changes the spot. 

You will need to know if the spot is moving from a touch, and not change it with the slider when the spot is touched.  You can add ButtonBehavior to the Label and use the on_press and on_release to create a touched property for the DragBlinkLabel and only have the slider change the pos of the spot, whet the spot is not touched.,

Dan Moormann

unread,
Nov 30, 2023, 5:26:40 PM11/30/23
to Kivy users support
Your recent fix took care of the issue (love it).
I see what you mean by the mouse getting further from the spot as it moves more.  I see what you mean by 2 things happening at once.  I call that a feedback loop.  I can easily see how action on the slider group causes the spot to be re-positioned but cannot figure out how moving the spot causes the slider to be updated.  The update between slider and spot needs to be one-way.  I'm not seeing how adding ButtonBehavior with on_press and on_release would create a touched property.  I added ButtonBehavior to DragBlinkLabel then drew a blank.

elli...@cox.net

unread,
Nov 30, 2023, 8:25:40 PM11/30/23
to kivy-...@googlegroups.com

I also though it was a feedback loop – but I know it was because the pixel density is not 1, so there needs to be an adjustment made relative to the pixel density.

 

The code below was going to be an example of how to use the touched property I created to break the feedback loop – but as I said that was not the issue.  FWIW ButtonBehavior did not seem to work with ButtonBehavior.  This is odd because I know I have dragged buttons in other apps….

 

Look at the highlighted code below:

 

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.uix.behaviors import DragBehavior
from kivy.animation import Animation

from kivy.properties import BooleanProperty

kv =
"""


<DragLabel>:
    # Define the properties for the DragLabel
    drag_rectangle: self.x, self.y, self.width, self.height
    drag_timeout: 10000000
    drag_distance: 0

<DragBlinkLabel>:

    text: '*'


    size_hint: None, None
    size: self.texture_size

BoxLayout:
    orientation: 'vertical'
    AnchorLayout:
        FloatLayout:
            id: fl
            size_hint: None, None
            size: dp(400), dp(400)
            canvas:
                Line:
                    rectangle: (*self.pos, *self.size)
            DragBlinkLabel:
                pos: self.parent.center
                id: spot
                on_y:
                    y_slider.value = (self.y - fl.y) / dp(1)
            Slider:
                id: y_slider
                size_hint_x: None
                width: dp(48)
                orientation: 'vertical'
                pos: fl.pos
                max: 400
                value: 200
                on_value:
                    spot.y = fl.y + dp(self.value)


               
    Switch:
        size_hint: None, None
        size: dp(100), dp(48)
        pos_hint: {'center_x': 0.5, 'y': 0}
        active: True  # set initial state

        on_active: spot.blink_on_off(self.active)
"""


class DragLabel(DragBehavior, Label):
   
pass


class

DragBlinkLabel(DragLabel):
    touched = BooleanProperty(
False)

   
def __init__(self, **kwargs):
       
super().__init__(**kwargs)
       
self.anim = (Animation(color=[1, 1, 0, 0], duration=0.5) +
                     Animation(
color=[1, 1, 0, 1], duration=0.5))
       
self.anim.repeat = True
       
self.anim.start(self)

   
def blink_on_off(self, active):
       
if not active:
           
self.anim.repeat = False
        else
:
           
self.anim.repeat = True
           
self.anim.start(self)

   
def on_touch_down(self, touch):
       
if self.collide_point(*touch.pos):
           
self.touched = True
        return
super().on_touch_down(touch)

   
def on_touch_up(self, touch):
       
if self.collide_point(*touch.pos):
           
self.touched = False
        return
super().on_touch_up(touch)



Dan Moormann

unread,
Nov 30, 2023, 11:23:03 PM11/30/23
to Kivy users support
Tried to get the above touched example to run stand alone.  Got error:

  File "C:\Users\danm9\testsite\main.py", line 9, in <module>
     test = Builder.load_string("""
            ^^^^^^^^^^^^^^^^^^^^^^^
   File "C:\Users\danm9\testsite\Lib\site-packages\kivy\lang\builder.py", line 407, in load_string
     self._apply_rule(
   File "C:\Users\danm9\testsite\Lib\site-packages\kivy\lang\builder.py", line 662, in _apply_rule
     self._apply_rule(
   File "C:\Users\danm9\testsite\Lib\site-packages\kivy\lang\builder.py", line 662, in _apply_rule
     self._apply_rule(
   File "C:\Users\danm9\testsite\Lib\site-packages\kivy\lang\builder.py", line 620, in _apply_rule
     cls = Factory_get(cname)
           ^^^^^^^^^^^^^^^^^^
   File "C:\Users\danm9\testsite\Lib\site-packages\kivy\factory.py", line 147, in __getattr__
     raise FactoryException('Unknown class <%s>' % name)
 kivy.factory.FactoryException: Unknown class <DragBlinkLabel>


Also pycharm says:
Unresolved attribute reference 'on_touch_down' for class 'super' 
main.py

Dan Moormann

unread,
Dec 1, 2023, 12:04:52 AM12/1/23
to Kivy users support
One more thing.
I'd like to replace the '*' in spot with a small square that would show the exact position.  I tried using Unicode u'\u25au'. but got a tall rectangle with an x through it.  I also tried to use the rectangle command but couldn't figure out how to put it in the kv file.

ElliotG

unread,
Dec 1, 2023, 9:18:49 AM12/1/23
to Kivy users support
It looks like the paste messed up the formatting - here is the stand=alone example.  The important thing is using the dp.  I created the touched property here - but then found it was not required.
drag_blink.py

ElliotG

unread,
Dec 1, 2023, 9:20:52 AM12/1/23
to Kivy users support
" I'd like to replace the '*' in spot with a small square that would show the exact position.  I tried using Unicode u'\u25au'. but got a tall rectangle with an x through it.  I also tried to use the rectangle command but couldn't figure out how to put it in the kv file. "

You need to select a font that has the desired glyph. 

On Thursday, November 30, 2023 at 10:04:52 PM UTC-7 dan...@gmail.com wrote:

Dan Moormann

unread,
Dec 2, 2023, 12:11:22 AM12/2/23
to Kivy users support
I was able to get your example to work and added a few simple changes.  I was able to replace the * with a square (in my code and yours) by adding the Webdings font (letter g) to <DragBlinkLabel> and a font_size of 20.  It moves and blinks (just like I wanted).  Thank you.

I'm having a terrible time trying to understand the logic/process in your code.  I added some print statements and changed 'self' to the widget id to try to get a handle on what's going on.

Why does the on_y fire twice before anything?
Why does spot go from 50 to 324 - shouldn't it be 200?
I have no idea what fl.y is.  I can see it's the id for FloatLayout.  It starts out at -150 then stays at 124 forever. Can layouts have a position?
I can see that 124 is the difference between spot.y and y_slider.value, but why?

When I touch a point on the slider it fires the on_value then on_y then on_value twice.
For example: If I touch a point at the bottom of slider (200) the y_slider value comes out to 0 but the spot.y goes to 124.

I would really appreciate it if you could explain what's happening.
Here are my mods to your code.
main.py

elli...@cox.net

unread,
Dec 2, 2023, 10:07:00 AM12/2/23
to kivy-...@googlegroups.com

Why does the on_y fire twice before anything?

The default position of a widget is (0,0).  I’m guessing that as the layouts position the widget to the initial position in the center it is happening across a few clock ticks, causing multiple events that end with the widget in the correct position.

 

Why does spot go from 50 to 324 - shouldn't it be 200?

The position of spot is relative the bottom of the enclosing layout.  We need to add the distance from the bottom of the window to the bottom of the rectangle to get the zero position of the slider.

 

I have no idea what fl.y is.  I can see it's the id for FloatLayout.  It starts out at -150 then stays at 124 forever. Can layouts have a position?

Yes, Layouts are widgets.  They have all the attributes of a Widget.  The have pos, size…  fl.y is the y value of the FloatLayout position, or in this case the bottom of the rectangle.

 

I can see that 124 is the difference between spot.y and y_slider.value, but why? 

That must be the difference between the bottom of the window and the size of the rectangle (the rectangle surrounds the FloatLayout).  The FloatLayout has a fixed size and is positioned in the center of the Window by the AnchorLayout.  If the slider went from the top to the bottom of the window this offset would not be necessary.

 

When I touch a point on the slider it fires the on_value then on_y then on_value twice.

This is the “feecback loop” The spot changes the slider, the slider changes the spot.  You can use the touched property to fix this:

DragBlinkLabel:
    pos: self.parent.center
    id: spot
    on_y:

        if self.touched: y_slider.value = (spot.y - fl.y) / dp(1)
        print('on_y    ',
        'spot.y',        int(spot.y),
        'fl.y',          int(fl.y),
        'dp(1)',         int(dp(1)),
        'y_slider.value',int(y_slider.value))


Slider:
    id: y_slider
    size_hint_x: None
    width: dp(48)
    orientation: 'vertical'
    pos: fl.pos

    min: 0


    max: 400
    value: 200
    on_value:

        if not spot.touched: spot.y = fl.y + dp(y_slider.value)
        print('on_value',
        'spot.y',        int(spot.y),
        'fl.y',          int(fl.y),
        'dp(1)',         int(dp(1)),
        'y_slider.value',int(y_slider.value))

 

 

For example: If I touch a point at the bottom of slider (200) the y_slider value comes out to 0 but the spot.y goes to 124.

The bottom of the slider is not in the bottom of the Window.  The spot.y is showing the Window coordinate.  You could change the FloatLayout to a RelativeLayout to having the spot position relative to the Layout rather than the window… this brings on all sorts of interesting complications.  Read: https://kivy.org/doc/stable/api-kivy.uix.relativelayout.html#coordinate-systems and the section below it titled Common Pitfalls.

 

 

Hope that helps!

Dan Moormann

unread,
Dec 3, 2023, 12:27:56 AM12/3/23
to Kivy users support
Absolutely stumped.  

I put in the touched code in slider_move and it looks like the wandering cursor has been fixed.  When I try to use the pos:x y TextInput widgets the spot does not move to the desired position.  Try putting in 100,100 and spot moves to 213,100.  If you do it a second time it moves to the correct position.  I don't know where to put the touched check for when it's true.

main.py
tutorial.kv

elli...@cox.net

unread,
Dec 3, 2023, 3:16:34 PM12/3/23
to kivy-...@googlegroups.com

You have a race condition…

Pos is changing both x and y.

The one of the sliders change, this causes the position to be updated, changing the position of the object, but using the old data from one of the sliders.

 

A bit of a hack… I changed x and y separately.  It would be better to more explicitly remove this race condition by having each slider only update the x or y attribute of spot.

 

Here is my change:


def ask_it(self):
    println(
'def xask_it',self.ids.spot.pos)
    x=
self.ids.txt2.text
    y=
self.ids.txt3.text
    println(x
,y)
   
if x.isdigit() and y.isdigit():
        x=
int(x); y=int(y)
        println(x
,y)
       
self.ids.spot.x = x
       
self.ids.spot.y = y
        println(
self.ids.spot.pos)
       
self.ids.txt2.text=''
       
self.ids.txt3.text=''
   
self.ids.txt2.focus=True

I would recommend you change each of the sliders so they change only the parameter they are effecting, spot.x or spot.y

elli...@cox.net

unread,
Dec 3, 2023, 3:32:47 PM12/3/23
to kivy-...@googlegroups.com

After rereading, I thought I would try again:

 

In ask_it(), you are changing spot.pos, changing both x and y.  When one of these values is changing, lets say x.  It changes the value of the x slider.  This causes the x slider to fire on_value.  This updates the x and y position, using the old data from the y slider in the call to slider_move() – it has not been updated yet. Overwriting the new data with the old data.  When you enter the data a second time, only the changed data (Y) fires an on_value event, so things work correctly.

 

I would recommend you change each of the sliders, so they change only the parameter they are affecting, spot.x or spot.y.   You could for example update slider_move to pass in a character ‘x’ or ‘y’ and a value, so you only change the parameter the slider is effecting.

 

Let me know if that makes sense.

elli...@cox.net

unread,
Dec 3, 2023, 3:42:09 PM12/3/23
to kivy-...@googlegroups.com

It is simple enough to just make the update to kv:

 

Slider:     #vertical slider
   
id: sliv
   
name: 'sliv'
   
orientation: 'vertical'
   
min: 0
   
max: 600
   
step: 1
   
size_hint: None,None
   
size: 10,170
   
pos: 27,102
   
value: int(spot.pos[1])
   
on_value:
        slav.
text = str(int(self.value))
        if not spot.touched: spot.
y = int(self.value)

 

And make a similar change the slih slider.

 

From: elli...@cox.net <elli...@cox.net>
Sent: Sunday, December 3, 2023 1:33 PM
To: 'kivy-...@googlegroups.com' <kivy-...@googlegroups.com>
Subject: RE: [kivy-users] Turn on/off blinking label

 

After rereading, I thought I would try again:

 

In ask_it(), you are changing spot.pos, changing both x and y.  When one of these values is changing, lets say x.  It changes the value of the x slider.  This causes the x slider to fire on_value.  This updates the x and y position, using the old data from the y slider in the call to slider_move() – it has not been updated yet. Overwriting the new data with the old data.  When you enter the data a second time, only the changed data (Y) fires an on_value event, so things work correctly.

 

I would recommend you change each of the sliders, so they change only the parameter they are affecting, spot.x or spot.y.   You could for example update slider_move to pass in a character ‘x’ or ‘y’ and a value, so you only change the parameter the slider is effecting.

 

Let me know if that makes sense.

 

From: kivy-...@googlegroups.com <kivy-...@googlegroups.com> On Behalf Of elli...@cox.net
Sent: Sunday, December 3, 2023 1:16 PM

Dan Moormann

unread,
Dec 3, 2023, 7:39:48 PM12/3/23
to Kivy users support
Everything is working (as far as I can tell).  Thank you so much for your assistance. 
Reply all
Reply to author
Forward
0 new messages