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に書いておくとよいでしょう。



Source: https://habr.com/ru/post/J341580/


All Articles