Forum Archive

Ui.textfield drives slider

Vertec

Is it possible to make a numeric entry field drive a slider position?

I have made a converter that converts feet to metres and also milliseconds (speed of sound) to calculate PA system delay times between speaker arrays. It currently works but I would love to add numeric entry to the slider.

Also at this time you move the slider and can activate feet/metres/milliseconds by turning on switches. How would I make it so the label that displays the output will update with a flock of a switch. (Ie change metres to feet) at present it doesn't update until you put your finger back on the slider

Phuket2

@Vertec, it's a little hard to know exactly what you are asking here. But I think your meaning is can these connections between the ui objects be done in the ui designer to update each other. Basically the answer is no if that was what you are asking.

You can having created your view in the designer write some code that will update the other objects. I know what I am saying is a little vague. But it's not a automatic connection. You can connect it in code. But there are many ways to do it. I did a very lazy one way example below. It's possibly very confusing. Not sure. But after all said and done, it's just worth reading about the ui module in the help.
Hope this gives you a idea anyway

import ui

def slider_action(sender):
    # get the sliders superview a.k.a view
    v = sender.superview
    v['mylabel'].text = str(sender.value)

if __name__ == '__main__':
    f = (0, 0, 300, 400)
    v = ui.View(frame = f, bg_color = 'white')
    slider = ui.Slider()
    slider.action = slider_action
    slider.width= v.width
    lb = ui.Label(name = 'mylabel')
    lb.text = '0'
    lb.y = slider.y + 20

    v.add_subview(slider)
    v.add_subview(lb)
    v.present('sheet')

Webmaster4o

@Phuket2 I think he was talking about doing I the other way around.

Phuket2

@Webmaster4o , yes I think so. But rather than not answer him I wanted to give him an idea. Just thought to make the other way, would be very difficult to follow. I think the actual question was about an automatic link done in the ui designer. Just wanted to show something possible in code, but to do it, he is better to read about the ui module first. The other way around you need delegates etc.. It's not hard, but you need to know about them

Phuket2

Ok, here is a dirty update to go the other way also. Look it's rough but you get the idea.

# coding: utf-8
import ui
import string

class MyTextFieldDelegate (object):
    def textfield_should_begin_editing(self, textfield):
        return True
    def textfield_did_begin_editing(self, textfield):
        pass
    def textfield_did_end_editing(self, textfield):
        pass
    def textfield_should_return(self, textfield):
        textfield.end_editing()
        self.update_slider(textfield)
        return True
    def textfield_should_change(self, textfield, range, replacement):
        if not range:
            self.update_slider(textfield)
            return True

        if replacement not in string.digits :
            return False

        return True
    def textfield_did_change(self, textfield):
        pass

    def update_slider(self, textfield):
        val = float(textfield.text) / 100.
        slider = textfield.superview['myslider']
        slider.value  = val 



def slider_action(sender):
    # get the sliders superview a.k.a view
    v = sender.superview
    v['mylabel'].text = str(sender.value)

if __name__ == '__main__':
    f = (0, 0, 300, 400)
    v = ui.View(frame = f, bg_color = 'white')
    slider = ui.Slider()
    slider.name = 'myslider'
    slider.action = slider_action
    slider.width= v.width
    lb = ui.Label(name = 'mylabel')
    lb.text = '0'
    lb.y = slider.y + 20

    tf = ui.TextField()
    tf.height = lb.height
    tf.delegate = MyTextFieldDelegate()
    tf.y = lb.y + lb.height + 20
    tf.text_color = 0



    v.add_subview(slider)
    v.add_subview(lb)
    v.add_subview(tf)
    v.present('sheet')

Cethric

Shouldn't

def textfield_should_change(self, textfield, range, replacement):
        if not range:
            self.update_slider(textfield)
            return True

        if replacement not in string.digits :
            return False

Be

def textfield_should_change(self, textfield, range, replacement):
        if not range and replacement in string.digits:
            self.update_slider(textfield)
        return True    

As checking if the new entry is a digit after converting the entry to a integer is a bit late? Or have I read that code wrong?

Vertec

Hi guys thank you for you help. May have gone over my head- my explanation is also lacking. Forgive me - I'm very new to this:
There are two things I'd like to happen in this script.

  1. When I flick either of the three switches I would like the textfield at top left to update to metres, feet or milliseconds (/speed of sound) - at present I have to flick switch and move slider prior to field updating.

  2. I would like to have the slider position update based on text input (numeric only) and relative to which switch is active.

Next two forum posts are my code and ui

Vertec
# coding: utf-8
import ui
import clipboard
import decimal
from random import random
from console import hud_alert

def switch_action1(sender):
    '@type sender: ui.Switch'
    v = sender.superview
    sw1 = v['switch1'].value 
    sw2 = v['switch2']
    sw3 = v['switch3']
    if (sw1):
        value = 1
        sw2.value = False
        sw3.value = False

def switch_action2(sender):
    '@type sender: ui.Switch'
    v = sender.superview
    sw1 = v['switch1']
    sw2 = v['switch2'].value
    sw3 = v['switch3']
    if (sw2):
        value = 1
        sw1.value = False
        sw3.value = False

def switch_action3(sender):
    '@type sender: ui.Switch'
    v = sender.superview
    sw1 = v['switch1']
    sw2 = v['switch2']
    sw3 = v['switch3'].value
    if (sw3):
        value = 1
        sw1.value = False
        sw2.value = False

def slider_action(sender):
    v = sender.superview
    numbers = v['slider1'].value
    v['numberval'].text = '%.fm' % (numbers*100.00)
    v['mval'].text = '%.2fm' % (numbers*100.00)
    v['msval'].text = '%.3fms' % (numbers*2.92*100)
    v['ftval'].text = '%.2fft' % (numbers*3.37*100)
    sw1 = v['switch1'].value
    sw2 = v['switch2'].value
    sw3 = v['switch3'].value
    metres = v['mval'].text
    msecs = v['msval'].text
    feet = v['ftval'].text
    if sw1:
        value = 1
        v['mfield'].text = metres
        v['numberval'].text = metres
        v['numberval'].text_color = 'd25050'
        v['slider1'].tint_color = 'd25050'
    if sw2:
        value = 1
        v['mfield'].text = msecs
        v['numberval'].text = msecs
        v['numberval'].text_color = '6bc68b'
        v['slider1'].tint_color = '6bc68b'
    if sw3:
        value = 1
        v['mfield'].text = feet
        v['numberval'].text = feet
        v['numberval'].text_color = '6a93fb'
        v['slider1'].tint_color = '6a93fb'

v = ui.load_view('VertecAxUi')
slider_action(v['slider1'])
switch_action1(v['switch1'])
switch_action2(v['switch2'])
switch_action3(v['switch3'])

if ui.get_screen_size()[1] >= 768:
    v.present('popover')
else:
    v.present()
Vertec

Hi guys

I can't find if I can send an image here so I'll try to describe ui in text

Text.field (displays slider value)

Slider (updates textfield taking multiplier value from which of three switches is active)

Switch 1(makes text field display slider in metres)
Switch 2(displays in feet)
Switch 3(displays in milliseconds/ speed of sound)

Label(displays value of active switch and changes text colour to match switch Color)

JonB

you just need to update the labels within the switch action. You might consider a separate update_labels() method which can be called from each switch, slider or textbox action as the final display update.

Phuket2

@Cethric , possibly. It has been a while since using that delegate. I just tried to get something working quickly to show the concept. Difficult some times giving examples. I would not have done it that way, I would have used a custom class etc...
I wonder sometimes about giving advise here. I can sort of help... Sort of 😱 In a way I would prefer not to. Only, because there are so many people better than me. But at the same time, I think I should try and not have only a few trying to support the many, myself included. Maybe I over think it. Oh well sh*t happens 😬

Cethric

Sometimes our best way of learning is by teaching/supporting/helping others as it forces us to think differently about something that we have learned. Keep teaching/supporting/helping people on here. At the end of the day you might know something that others don't, or can provide a shorted possibly better answer than what others could do.
If the answer you give doesn't go so well, you have the safety net of everyone else around, so long as you learn from it.

Vertec

Off Topic : my two cents and Freudian babble

Sharing information is everything.

I work in the events industry. Over 20 years as a vision tech, live audio engineer and more recently TD and production manager.

For at least 15 of those years I've fought against the tendency of some professionals to want to hoard knowledge and not impart skills.

All this achieves is bad practice across all sectors (hobby programming included) and eventually when one needs assistance one can't find skilled help as you get peers that don't have the skills to be supportive.

Any argument that imparting knowledge disadvantages the teacher is based on nothing more than fear.

I order to stay at the top of our game we must research and improve eternally. If we all strive to build on our skill-sets then naturally we will always be ahead of those newer to the game and behind those with more years of service than us. This is how it's meant to be.

I shouldn't complain. Three months ago after a life changing event (ruptured aneurysm) I left the events production industry for a permanent job at a University working as a trainer. Now I get to choose how knowledge is imparted every day.

I've got time to breathe and time to learn all those things I'd been putting off. Like Python...