
Android向けのQPythonエンジン(およびQPython 3)の理解はまだ不十分であり、特にAndroidの組み込みScripting Layer(SL4A)ライブラリに関しては、androidhelperでもあります。 このライブラリは、20%の空き時間の原則に基づいてGoogleの複数の従業員によって作成され、Spartanのドキュメントが提供されています。 SL4Aについて少しずつ検索しましたが、時間が経つにつれて、必要なものはほぼすべて見つかりました。
SL4Aでは、標準のAndroidダイアログを使用して、テキスト入力、リスト、質問、ラジオボタン、日付選択など、matplotlibなどのライブラリまで、コンソールPython 3のほぼすべての機能を使用できます。 このプログラムは美しさに驚くことはありませんが、多くの問題を解決することができます。 最も重要なことは、デバイスのさまざまな機能にアクセスできることです。 たとえば、次のことができます。
- 電話をかける
- SMSを送信
- 音量を変える
- 無線LANとBluetoothをオンにします
- ウェブページを開く
- サードパーティのアプリケーションを開く
- カメラで写真やビデオを撮る
- 連絡先帳から連絡先を抽出する
- システムアラートを送信する
- デバイスのGPS座標を決定する
- バッテリーを検出
- SIMカードデータを読み取る
- メディアを再生する
- クリップボードを操作する
- 音声メッセージを生成する
- データを外部活動にエクスポート(共有)
- ローカルhtmlページを開く
- その他
この例では、タスクの最も単純なリストを作成します。 タスクを作成および削除し、エクスポートすることができます。 プログラムは振動して話します。 リスト、テキスト入力、はい/いいえの質問の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に書いておくとよいでしょう。