QPython3およびSL4Aを介したAndroid向けPython 3のTo Doリストの作成







Android向けのQPythonエンジン(およびQPython 3)の理解はまだ不十分であり、特にAndroidの組み込みScripting Layer(SL4A)ライブラリに関しては、androidhelperでもあります。 このライブラリは、20%の空き時間の原則に基づいてGoogleの複数の従業員によって作成され、Spartanのドキュメントが提供されています。 SL4Aについて少しずつ検索しましたが、時間が経つにつれて、必要なものはほぼすべて見つかりました。







SL4Aでは、標準のAndroidダイアログを使用して、テキスト入力、リスト、質問、ラジオボタン、日付選択など、matplotlibなどのライブラリまで、コンソールPython 3のほぼすべての機能を使用できます。 このプログラムは美しさに驚くことはありませんが、多くの問題を解決することができます。 最も重要なことは、デバイスのさまざまな機能にアクセスできることです。 たとえば、次のことができます。









この例では、タスクの最も単純なリストを作成します。 タスクを作成および削除し、エクスポートすることができます。 プログラムは振動して話します。 リスト、テキスト入力、はい/いいえの質問の3種類のダイアログを使用します。 あらゆるものについて、100行未満のコードで十分です。 汎用性(およびGitHub)のために、インターフェイスを英語にします。







ここに、最も重要な点に関するすべてのコードとコメントがあります。







from androidhelper import Android droid = Android()
      
      





SL4Aとの対話を担当するAndroidクラスのdroidオブジェクト()を作成します。







 path=droid.environment()[1]["download"][:droid.environment()[1]["download"].index("/Download")] + "/qpython/scripts3/tasks.txt"
      
      





パス変数には、タスクが保存されているファイルの絶対名が含まれます。 なぜそんなに長いのですか? 実際、SL4Aはローカルパスで動作できないため、絶対値を決定する必要があります。絶対値はAndroidデバイスによって異なる場合があります。 この問題を回避するには、 droid.environment()



メソッドを使用してDownload



フォルダーを見つけます。 次に、 Download



を切断し、 Qpython/Scripts3



(常に同じ)とファイル名を追加します。







 def dialog_list(options): droid.dialogCreateAlert("\ud83d\udcc3 My Tasks (%d)" % len(options)) droid.dialogSetItems(options) droid.dialogSetPositiveButtonText("\u2795") droid.dialogSetNegativeButtonText("Exit") droid.dialogSetNeutralButtonText("\u2702") droid.dialogShow() return droid.dialogGetResponse()[1]
      
      





タスクをリストする機能を定義します。 これは、 droid.dialogCreateAlert()



メソッドを使用して行われます。 次に、多くのヘルパーメソッドが実際のアイテムを表示し、ボタンを作成してユーザーから結果を取得します。 2つのボタンの名前はUnicode文字です(詳細は以下を参照)。 単純化するために、これらすべてのメソッドを1つの単純な関数にまとめ、タスクのリストを転送します。 より複雑なスクリプトでは、タイトル、ボタン名など、より多くの引数を渡すことができます。







 def dialog_text(default): droid.dialogCreateInput("\u2795 New Task", "Enter a new task:", default) droid.dialogSetPositiveButtonText("Submit") droid.dialogSetNeutralButtonText("Clear") droid.dialogSetNegativeButtonText("Cancel") droid.dialogShow() return droid.dialogGetResponse()[1]
      
      





新しいタスクを作成する機能を定義します。 原理は似ています。 default



引数では、デフォルトで入力行に表示されるテキストを渡します(「」で空)。 より複雑なプログラムでは、さまざまな署名とボタンを転送できます。







 def dialog_confirm(message): droid.dialogCreateAlert("Confirmation", message) droid.dialogSetPositiveButtonText("Yes") droid.dialogSetNegativeButtonText("No") droid.dialogShow() return droid.dialogGetResponse().result
      
      





この関数は、yesまたはnoの回答を得るためにユーザーに質問します。 彼女に質問のテキストを渡します。







 while 1: try: with open(path) as file: tasks=file.readlines() except: droid.makeToast("File %s not found or opening error" % path) tasks=[]
      
      





ループを作成し(最初のアクションの後にスクリプトが終了しないようにするため)、最初に読み込むのはタスクファイルで、 tasks



リストにロードします。 ファイルがない場合は、空のリストを作成します。







 response=dialog_list(tasks)
      
      





タスクをリストします。 ユーザーが選択を行うと、 dialog_list()



メソッドは、 response



変数に割り当てる値としてこのアクションを返します。







 if "item" in response: del tasks[response["item"]] droid.vibrate(200) droid.makeToast(" !") droid.ttsSpeak(" !")
      
      





ユーザーアクションの処理を開始します。 リスト関数で使用するdroid.dialogGetResponse()



メソッドは、辞書の形でかなり複雑な構造を生成するため、最も明白な方法ではなくdroid.dialogGetResponse()



する必要があります。 この場合、リスト項目をクリックするだけで削除されます-タスクが完了しました。 これについてはポップアップメッセージで通知し、同時に(純粋に楽しいために)200ミリ秒間振動するアラートを作成し、音声フレーズを生成します。 。







 elif "which" in response: if "neutral" in response["which"]: choice=dialog_confirm("Are you sure you want to wipe all tasks?") if choice!=None and "which" in choice and choice["which"]=="positive": tasks=[]
      
      





ハサミで中央(中立)ボタンをクリックすると、すべてのケースをすぐに削除できます。 確認の質問が表示されます。







 elif "positive" in response["which"]: default="" while 1: input=dialog_text(default) if "canceled" in input: default=input["value"] elif "neutral" in input["which"]: default="" elif "positive" in input["which"]: tasks.append(input["value"]+"\n") droid.ttsSpeak(" !") break else: break else: exit=True
      
      





ここで、新しいタスクを作成します。 cancel



変数に注意しましょう-ダイアログの外側をクリックした場合(画面の空の領域droid.dialogGetResponse()



droid.dialogGetResponse()



によって発行されます。 この状況を正しく処理するために、追加の条件を導入しました。 中央のボタン( neutral



)により、入力フィールドがクリアされます。 positive



場合、新しいリストアイテムを作成し、ループを終了します。 右端のボタンをクリックすると、 else



ボタンが機能し、何も保存せずにループを終了します(正式にはinput["which"]



negative



値になりinput["which"]



)。 最後の行は、ユーザーが[ Exit



クリックしたことを意味します。 次に、 exit



フラグをTrue



設定しTrue









 with open(path, "w") as file: for i in range(len(tasks)): file.write(tasks[i])
      
      





リストを処理するたびに、タスクリストをファイルに保存します。







 if exit==True: break
      
      





ユーザーが終了することに決めた場合、メインのwhile



を終了while









 choice=dialog_confirm("Do you want to export tasks?") if choice!=None and "which" in choice and choice["which"]=="positive": droid.sendEmail("Email", "My Tasks", ''.join(tasks), attachmentUri=None)
      
      





最後に、メール、クラウド、メッセンジャーなど、すべてのタスクをどこかにエクスポートする必要があるかどうかをユーザーに尋ねます。 答えが「はい」の場合、タスクリストは文字列に変換されてエクスポートされます。







それだけです プログラムは上のスクリーンショットのようになります。







全リスト



最終的な完全なリスト(英語のコメント付き):







 #!/usr/bin/python # -*- coding: utf-8 -*- # This is a very simple to-do list for Android. Requires QPython3 to run (download it from Google Play Market). from androidhelper import Android droid = Android() # Find absolute path on Android path=droid.environment()[1]["download"][:droid.environment()[1]["download"].index("/Download")] + "/qpython/scripts3/tasks.txt" def dialog_list(options): """Show tasks""" droid.dialogCreateAlert("\ud83d\udcc3 My Tasks (%d)" % len(options)) droid.dialogSetItems(options) droid.dialogSetPositiveButtonText("\u2795") droid.dialogSetNegativeButtonText("Exit") droid.dialogSetNeutralButtonText("\u2702") droid.dialogShow() return droid.dialogGetResponse()[1] def dialog_text(default): """Show text input""" droid.dialogCreateInput("\u2795 New Task", "Enter a new task:", default) droid.dialogSetPositiveButtonText("Submit") droid.dialogSetNeutralButtonText("Clear") droid.dialogSetNegativeButtonText("Cancel") droid.dialogShow() return droid.dialogGetResponse()[1] def dialog_confirm(message): """Confirm yes or no""" droid.dialogCreateAlert("Confirmation", message) droid.dialogSetPositiveButtonText("Yes") droid.dialogSetNegativeButtonText("No") droid.dialogShow() return droid.dialogGetResponse().result # Run main cycle while 1: # Open file try: with open(path) as file: tasks=file.readlines() except: droid.makeToast("File %s not found or opening error" % path) tasks=[] # Show tasks and wait for user response response=dialog_list(tasks) # Process response if "item" in response: # delete individual task del tasks[response["item"]] droid.vibrate(200) droid.makeToast(" !") droid.ttsSpeak(" !") elif "which" in response: if "neutral" in response["which"]: # delete all tasks choice=dialog_confirm("Are you sure you want to wipe all tasks?") if choice!=None and "which" in choice and choice["which"]=="positive": tasks=[] elif "positive" in response["which"]: # create new task default="" while 1: input=dialog_text(default) if "canceled" in input: default=input["value"] elif "neutral" in input["which"]: # clear input default="" elif "positive" in input["which"]: # create new task tasks.append(input["value"]+"\n") droid.ttsSpeak(" !") break else: break else: exit=True # Save tasks to file with open(path, "w") as file: for i in range(len(tasks)): file.write(tasks[i]) # If user chose to exit, break cycle and quit if exit==True: break # Export tasks choice=dialog_confirm("Do you want to export tasks?") if choice!=None and "which" in choice and choice["which"]=="positive": droid.sendEmail("Email", "My Tasks", ''.join(tasks), attachmentUri=None)
      
      





GitHubでも見つけることができます







いくつかのコメント。 SL4Aはグラフィックの使用を許可しませんが、 かなり多くのさまざまな笑顔と絵文字をUnicode文字として使用できます。 少なくとも家、少なくとも犬、少なくとも猫であることができます。 この例では、プラス記号( \u2795



)、はさみ( \u2702



)、および紙( \ud83d\udcc3



)を使用しました。 Unicodeの新しいバージョンごとに、それらはますます増えていますが、これは悪用されるべきではありません-新しい絵文字はAndroidの古いバージョンでは表示されません。







QPythonスクリプトを実行するには、QPython自体にアクセスする必要がありますが、デスクトップにアイコンとして表示したり、さまざまな条件下で起動したりするなど、QPythonスクリプトで非常に強力なことを実行できるTaskerアプリケーション用の興味深いプラグインがあります。







関連リソース





PS質問とコメントはPMに書いておくとよいでしょう。








All Articles