• ramvee

    Thank You @ccc .

    You're always there :)
    And I'm sure, you can reduce this code by half !

    posted in Pythonista read more
  • ramvee

    Hi Friends,
    After a long time, I was writing code in pythonista, to help learn, playing piano notes.
    I am sure this may not be the optimal solutiion. But it works, and I am always ready to
    learn from the experts here. Thank You!

    # to learn playing piano keys from phone display
    # not scaled for ipad
    import ui
    import sound
    import time
    from random import choice
    from scripter import script, start_scripter
    
    td=1 # default time delay 1 sec
    
    # piano keys from A3 to G4# are Available with following names (21 keys)
    piano_klist = [
            "piano:C3", "piano:C3#", 
            "piano:D3", "piano:D3#", "piano:E3", 
            "piano:F3", "piano:F3#", 
            "piano:G3", "piano:G3#", 
            "piano:A3", "piano:A3#", "piano:B3",
            "piano:C4", "piano:C4#", 
            "piano:D4", "piano:D4#", "piano:E4", 
            "piano:F4", "piano:F4#", 
            "piano:G4", "piano:G4#"
            ]
    
    # to load sound effects for minimum latency
    for key_name in piano_klist:
        sound.load_effect(key_name)
    
    def slider_action(sender):
        global td
        # to set slider value reversed, so that
        # bpm can go up sliding towards right
        td = round(((1-sender.value)*1.75)+0.2, 2)
        bpm=int (60/td)
        lb.text= str(bpm) + ' BPM'
        # I put this here hoping it will avoid keyboard popping up
        # and covering the display area
        ui.end_editing()
    
    # very important to update label with name of music note
    @script
    def rnd_note(sender):
        # set to practice for 12 notes at a time
        repeat = 12
        for note in range(repeat):
            key_name = choice(piano_klist)
            time.sleep(td)
            lb1.text = key_name[6:]
            sound.play_effect(key_name)
            yield
        time.sleep(td)
        lb1.text = '♫'
        lb.text = 'Tempo Slider'
    
    w,h = ui.get_screen_size()
    # if in landscape mode
    if w>h:
        w,h=h,w
    gap = 10
    
    v = ui.View(name='Piano Practice', bg_color = 'lightyellow')
    v.frame = (gap,gap,w,h)
    start_scripter(v)
    
    lb = ui.Label(name = 'mylabel')
    lb.frame=(gap*2, 10, w-4*gap, 30)
    lb.background_color='gray'
    lb.text_color = 'yellow'
    lb.font = ('Helvetica', 18)
    lb.text = 'Set Tempo BPM'
    lb.alignment =1
    lb.flex = 'W'
    
    slider = ui.Slider()
    slider.value=0.5
    slider.frame=(gap*2,gap+32,w-4*gap,50)
    slider.background_color='gray'
    slider.flex = 'W'
    slider.action = slider_action
        
    lb1 = ui.Label(name = 'note')
    lb1.frame= (gap*2, gap+100, w-4*gap, h-475)
    lb1.font = ('Helvetica', 150 )
    lb1.text_color = 'yellow'
    lb1.alignment =1
    lb1.background_color = 'gray'
    lb1.text = '♫'
    lb1.flex = 'W'
    
    button = ui.Button(name='start')
    button.frame = (gap*2, 300, w-4*gap, 40)
    button.bg_color='yellow'
    button.border_width=1
    button.title='Start'
    button.font = ('Helvetica', 18)
    button.flex = 'W'
    button.action=rnd_note
    
    v.add_subview(slider)
    v.add_subview(lb)
    v.add_subview(lb1)
    v.add_subview(button)
    
    v.present('sheet')
    

    posted in Pythonista read more
  • ramvee

    I use both Carnets and Pyto, and love both of them.
    But I am not an advanced user so they help me learn Jupiter Notebooks (Carnets)
    And both can run Pandas, which is superb.
    Pyto is updated regularly and runs 3.8 version of Python

    posted in Pythonista read more
  • ramvee

    I Am Using Pythonista On My iPad Pro And I Have No Issues At All, It Works Fine.

    posted in Pythonista read more
  • ramvee

    I love Pythonista, and learned a lot of Python on the go..
    Apart from pythonista, i am enjoying Pyto (with Python3.8) and Carnets (Like Jupyter Notebooks), especially, as both of these work with Pandas.

    posted in Pythonista read more
  • ramvee

    Thank you @cvp for all your help and @Phuket2 for filtering code.
    I have put up the fully working version below.
    I use this to order a lot of books for our bookstore.
    I have the csv data file with a few thousand records of book title and book author.

    import ui
    
    items = [
        ['Pretty Woman', 'Julia Roberts'],  
        ['Seven Year Itch', 'Marilyn Monroe'],
        ['Casablanca' , 'Ingrid Bergman'],
        ['Roman Holiday','Audrey Hepburn'],
        ['African Queen','Katherine Hepburn'],
        ['Out Of Africa','Meryl Streep'],
        ['Cleopatra','Elizabeth Taylor'],
        ['Titanic','Kate Winslet'],
        ['Apartment','Shirley MacLaine'],
        ['West Side Story','Natalie Wood'],
        ['Rear Window','Grace Kelly'],
        ['Pillow Talk','Doris Day'],
        ['Sound Of Music','Julie Andrews'], 
        ['Love Story','Ali McGraw'],
        ['You Got Mail','Meg Ryan'],
        ['Clueless','Alicia Silverstone'],
        ['Great Gatsby','Mia Farrow'],
        ['Mask','Cameron Diaz'],
        ['Kill Bill', 'Uma Thurman'],
        ]
    
    w,h = ui.get_screen_size()
    h=h-64
    gap = 5
    fontsize = 15 if w<750 else int((w / 75) + 16)
    
    class MyTableViewDataSource (object):
        def tableview_cell_for_row(self, tableview, section, row):
            row_title, row_description = tableview.data_source.items[row]
            # 'subtitle'-style cells come with a built-in secondary label
            cell = ui.TableViewCell('subtitle')
            cell.text_label.text = row_title
            cell.text_label.text_color = 'blue'
            cell.detail_text_label.text = row_description
            cell.detail_text_label.text_color = 'slateblue'
            return cell
         
        def tableview_number_of_rows(self, tableview, section):
            return len(tableview.data_source.items)
            
    class MyTableViewDelegate (object):
            def tableview_did_select(self, tableview, section, row):
                main, desc = tableview.data_source.items[row]
                print(f'{main}, {desc}')
                
    class MyTextFieldDelegate (object):
        items = items or []
        def textfield_did_change(self, textfield):
            self.filter_data(textfield.text)
    
        def filter_data(self, filter_text=''):
            ft = filter_text.lower()
            if not len(ft):
                tbl.data_source.items = self.items
                tbl.reload()
            else:
                tbl.data_source.items = [s for s in self.items if (ft in s[0].lower()) or (ft in s[1].lower())]
                tbl.reload()
        
    view = ui.View(name='Filter Items', frame =(0,0,w,h), bg_color='slateblue')
    
    tf = ui.TextField(frame=(gap,gap,w-gap*2,32), flex='w', placeholder='Search', clear_button_mode='always')
    tf.delegate = MyTextFieldDelegate()
    view.add_subview(tf)
        
    tbl = ui.TableView(frame=(gap,42,w-gap*2,h-42), corner_radius=3, flex='wh')
    tbl.row_height=fontsize*2.5
    tbl.name = 'Item Table'
    tbl.separator_color = 'grey'
    tbl.data_source = MyTableViewDataSource()
    tbl.data_source.items = items
    tbl.delegate = MyTableViewDelegate()
    view.add_subview(tbl)
    
    view.present('sheet', title_bar_color= 'slateblue')
    

    posted in Pythonista read more
  • ramvee

    Thank You Very Much For The Prompt Reply @cvp !
    I can figure it out now. :)

    posted in Pythonista read more
  • ramvee

    @foundjem
    No, it does not.
    So I use 'carnets' app which has support of most modules including pandas.
    carnets is jupyter notebooks on iOS, it is great and free.. a little quirky, though :)

    posted in Pythonista read more
  • ramvee

    Hi Friends,
    I am trying to use a filter which must update the data source continuously in my tableview.
    I figured it out for ui.LitsDataSource but i have wasted a couple of days trying to do the same with
    MyTableViewDataSource method.
    This filter was shown by a kind friend @Phuket2 about 2 years ago.
    It was must a very simple mistake i am making, tried using reload() method too.
    Here is my program, forgive the sloppiness..
    Thank you.

    # filtering data with two items per record
    # example with tableview cells with subtitles
    # And TableView Delegate method
    
    import ui
    
    items = [
        ['Pretty Woman', 'Julia Roberts'],  
        ['Seven Year Itch', 'Marilyn Monroe'],['Casablanca' , 'Ingrid Bergman'],
        ['Roman Holiday','Audrey Hepburn'],
        ['Sound Of Music','Julie Andrews'], 
        ['Love Story','Ali McGraw'],
        ['You Got Mail','Meg Ryan'],
        ['Clueless','Alicia Silverstone'],
        ['Great Gatsby','Mia Farrow'],
        ['Mask','Cameron Diaz']     
        ]
    
    w,h = ui.get_screen_size()
    h=h-64
    gap = 5
    fontsize = 15 if w<750 else int((w / 75) + 16)
    
    def reload_data():
        tbl.data_source.reload()
    
    class MyTableViewDataSource (object):
        def tableview_cell_for_row(self, tableview, section, row):
            row_title, row_description = items[row]
            # 'subtitle'-style cells come with a built-in secondary label
            cell = ui.TableViewCell('subtitle')
            cell.text_label.text = row_title
            cell.text_label.text_color = 'blue'
            cell.detail_text_label.text = row_description
            cell.detail_text_label.text_color = 'slateblue' #'#555'
            return cell
         
        def tableview_number_of_rows(self, tableview, section):
            return len(items)
            
    class MyTableViewDelegate (object):
            def tableview_did_select(self, tableview, section, row):
                print(f'{items[row][0]}, {items[row][1]}')
                
    class MyTextFieldDelegate (object):
        items = items or []
        def textfield_did_change(self, textfield):
            self.filter_data(textfield.text)
    
        def filter_data(self, filter_text=''):
            ft = filter_text.lower()
            if not len(ft):
                tbl.data_source.items = self.items
            else:
                for s in self.items:
                    if ft in (s[0].lower()) or ft in (s[1].lower()):
                        tbl.data_source.items = s
                        ## Need this to be updated
                        ## in the tableview 
        
    view = ui.View(name='Filter Items', frame =(0,0,w,h), bg_color='slateblue')
    
    tf = ui.TextField(frame=(gap,gap,w-gap*2,32), flex='w', placeholder='Search', clear_button_mode='always')
    tf.delegate = MyTextFieldDelegate()
    view.add_subview(tf)
        
    tbl = ui.TableView(frame=(gap,42,w-gap*2,h-42), corner_radius=3, flex='wh')
    tbl.row_height=fontsize*2.5
    tbl.name = 'Item Table'
    tbl.separator_color = 'grey'
    tbl.data_source = MyTableViewDataSource()
    tbl.delegate = MyTableViewDelegate()
    view.add_subview(tbl)
    
    view.present('sheet', title_bar_color= 'slateblue')
    

    posted in Pythonista read more
  • ramvee

    Love Pythonista And Love Reddit.
    I think the biggest advantage in moving to Reddit would be getting a more intelligent search, searching in this forum is not good.
    I am no expert but i see no downside to shifting to Reddit.

    posted in Pythonista read more

Internal error.

Oops! Looks like something went wrong!