omz:forum

    • Register
    • Login
    • Search
    • Recent
    • Popular

    Welcome!

    This is the community forum for my apps Pythonista and Editorial.

    For individual support questions, you can also send an email. If you have a very short question or just want to say hello — I'm @olemoritz on Twitter.


    Ui.textfield drives slider

    Pythonista
    5
    13
    9192
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Vertec
      Vertec last edited by

      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 1 Reply Last reply Reply Quote 0
      • Phuket2
        Phuket2 @Vertec last edited by

        @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 1 Reply Last reply Reply Quote 0
        • Webmaster4o
          Webmaster4o @Phuket2 last edited by

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

          Phuket2 1 Reply Last reply Reply Quote 0
          • Phuket2
            Phuket2 @Webmaster4o last edited by

            @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

            1 Reply Last reply Reply Quote 0
            • Phuket2
              Phuket2 last edited by

              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')
              	
              
              1 Reply Last reply Reply Quote 1
              • Cethric
                Cethric last edited by

                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?

                Phuket2 1 Reply Last reply Reply Quote 0
                • Vertec
                  Vertec last edited by

                  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

                  1 Reply Last reply Reply Quote 0
                  • Vertec
                    Vertec last edited by

                    # 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()
                    
                    1 Reply Last reply Reply Quote 0
                    • Vertec
                      Vertec last edited by

                      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)

                      1 Reply Last reply Reply Quote 0
                      • JonB
                        JonB last edited by

                        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.

                        1 Reply Last reply Reply Quote 0
                        • Phuket2
                          Phuket2 @Cethric last edited by

                          @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 😬

                          1 Reply Last reply Reply Quote 0
                          • Cethric
                            Cethric last edited by

                            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.

                            1 Reply Last reply Reply Quote 1
                            • Vertec
                              Vertec last edited by

                              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...

                              1 Reply Last reply Reply Quote 0
                              • First post
                                Last post
                              Powered by NodeBB Forums | Contributors