omz:forum

    • Register
    • Login
    • Search
    • Recent
    • Popular
    1. Home
    2. RealTexasSwag

    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.


    • Profile
    • Following 0
    • Followers 0
    • Topics 1
    • Posts 2
    • Best 0
    • Controversial 0
    • Groups 0

    RealTexasSwag

    @RealTexasSwag

    0
    Reputation
    717
    Profile views
    2
    Posts
    0
    Followers
    0
    Following
    Joined Last Online
    Age 24

    RealTexasSwag Unfollow Follow

    Latest posts made by RealTexasSwag

    • RE: Widget self-called refresh/animation

      Thanks for those suggestions, learning about threading was very helpful.

      Apparently, the while loop was working the whole time! I feel very silly now. It didn't appear to be working because it always updated the decibel level to be -120 (which is unusual because -160 is typically silence). It is my hypothesis that Apple restricts widgets in certain ways like recording (which is odd because I've used taptic feedback in a widget before). (Ex: the Shazam app has a widget, but it has to open the app to work.) Anyway, my new problem will be figuring out if it's possible to collect and analyze the recording elsewhere and pass that information to the widget through some sort of callback url.

      posted in Pythonista
      RealTexasSwag
      RealTexasSwag
    • Widget self-called refresh/animation

      Hi all, this is my first post, although I've been enjoying Pythonista for several years now. Wonderful app!

      Recently I've been working with the new Widget functionality. I'm currently trying to make a widget that represents the decibel sound level. I'm able to get this decibel information from an "AVAudioSession" using objc_util. My problem is displaying it.

      The below code works fine in the widget simulator (when it's run from the file, in-app), but only refreshes once in Today View. I have tried everything I can think of: wrapping it in a ui.View class, creating a custom draw method, calling set_needs_display, ... nothing works. I ran into this same problem when I tried to write a text-based snake game for the widget. Hopefully one of you will be able to figure out where I went wrong.

      (I say "self-called refresh" as opposed to being called by a touch or button--those seem to work fine. Perhaps the solution is to simulate a button press to refresh.)

      #!python3
      from objc_util import *
      import os, ui
      import appex
      import time
      
      def record():
        AVAudioSession = ObjCClass('AVAudioSession')
        NSURL = ObjCClass('NSURL')
        AVAudioRecorder = ObjCClass('AVAudioRecorder')
        shared_session = AVAudioSession.sharedInstance()
        category_set = shared_session.setCategory_error_(ns('AVAudioSessionCategoryPlayAndRecord'), None)
        settings = {ns('AVFormatIDKey'): ns(1633772320), ns('AVSampleRateKey'):ns(0.5), ns('AVNumberOfChannelsKey'):ns(1)}
        output_path = os.path.abspath('Recording.m4a')
        out_url = NSURL.fileURLWithPath_(ns(output_path))
        recorder = AVAudioRecorder.alloc().initWithURL_settings_error_(out_url, settings, None)
        recorder.record()
        recorder.setMeteringEnabled_(True)
        return recorder
      
      label = ui.Label()
      label.text = 'Please wait...'
      label.font = ('Menlo', 24)
      label.alignment = ui.ALIGN_CENTER
      label.text_color = 'red'
      appex.set_widget_view(label)
      recorder = record()
      while True:
        recorder.updateMeters()
        label.text = str(recorder.peakPowerForChannel_(0))[: 6] + ' dB'
        label.set_needs_display()
        time.sleep(.25)
      
      posted in Pythonista
      RealTexasSwag
      RealTexasSwag