よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

QPythonによるQPythonの為のGUIアプリ開発/インプットダイアログ編

通常、アプリと言えばボタンが並んだ画面で、マウスクリックやキーボード、パネルのタッチ操作をする事により動かせるGUIアプリを思い浮かべます。
GUIアプリを作るには何かと手間が掛かります。
しかし!、QPythonを使えば、QPythonをインストールした端末上で動くGUIアプリ簡単に作ることができます。


目次

目的・目標

  • QPythonを使って、
  • QPythonで動く(しか動かない(笑))、
  • GUIのインプットダイアログから入力を取得する、

簡単なアプリ(関数)開発を行う。

作る処理の流れ

  1. 入力画面を出す
  2. 入力させる
  3. 入力値を取得
  4. Ok/Cancel の判定
  • OK の場合の場合の処理
  • Cancel の場合の処理

前提

  • Android端末にQPythonがインストールされている
  • python3が動かせる。(当方はQPython、QPython3、QPy3.6を3つ共にインストールしたスマホで行っています)


この回では、androidhelperクラスを使用してGUIを操作します。
androidhelperは、様々なスクリプト言語によってAndroidとやり取りできるSL4AQPython用に改造したクラスなので、QPythonが導入された端末でしか動きません。ご注意下さい。

作成手順

エディタからQuietScriptsを新規作成

QPython用のスクリプトを書くだけならOSやエディタを選びませんが、QPythonのエディタを使えばアプリが自動的に行ってくれるいくつかの手間が省かれ便利ですので、QPythonで作成する手順を書きます。


QuietScriptsで作成すると、そのスクリプトは実行時にバックグラウンドで動作するモードで動きます。
このモードではコンソールが立ち上がらないので、print関数などを使って表示出来ません。若干の注意がいります。
(スクリプトの書き方によっては「実行ボタンを押しても何も起こらない!」ように見えます。)





では始めていきます。



QPython起動 → エディタアイコンでエディタを開く → 画面右上の「」アイコンをタップ → QuietScriptsをタップ


上から3つ目のQuietScriptsを選択
f:id:chayarokurokuro:20190517212224j:plain


すると新規プロジェクトの名前を入力するダイアログが出ます。入力してOK

f:id:chayarokurokuro:20190517213300j:plain

これでひとまずプロジェクトが新規に追加されました。


追加した新規プロジェクトは、qpythonフォルダ内のprojects3フォルダに、いま付けた新規プロジェクト名を名前としたフォルダとして自動的に作られます。


プロジェクトの自動保存先
qpython/scripts3/新規プロジェクト名フォルダ


更に新規プロジェクトフォルダの中にはmain.pyが自動作成されます。
いま、8行目まで自動で記入されたmain.pyがエディタで開いていると思いますが、それです。

qpython/scripts3/新規プロジェクトフォルダ/main.py

f:id:chayarokurokuro:20190517214655j:plain


ここまで出来たら、上で出来たmain.pyのコードを改造して、動作させたいように書いていきます。




スクリプトの記入と説明

新規プロジェクト作成で自動的に作られたmain.pyには既に8行目まで何か書かれていました。
それを以下のように書き換えて行きます。


コメントで見づらいかも…

#-*-coding:utf8;-*-
#qpy:quiet  この行を消すとクワイエットモードではなくなり、コンソールが立ち上がるようになる。
"""
This is a quiet script, which runs background
"""
# androidhelperのインポートと、そのインスタンス化。魔法の2行。
import androidhelper
droid = androidhelper.Android()

#toastで画面下に何か出る。出ない場合はAndroid端末の歯車「設定」から「通知」をイジってみてください
droid.makeToast("quietモード中! ")


#################################
#GUIの入力ダイアログを使った関数の定義
#################################
def input_text():
    
    #ここから入力と、その取得の処理 
    
    ##GUIで入力用ダイアログを出す
    droid.dialogCreateInput("テキストを入力してね。") 
    
    ##入力ダイアログに Ok ボタン設置
    droid.dialogSetPositiveButtonText("Ok") 
    
    ##入力ダイアログに Cancel ボタン設置
    droid.dialogSetNegativeButtonText("Cancel") 
    
    ##上で用意した入力ダイアログを画面に出す
    droid.dialogShow() 
    
    ##上で入力した内容を取得し text に格納
    text = droid.dialogGetResponse() 
    
    ##入力ダイアログを画面から消す
#    droid.dialogDismiss()
    
    ##取得したtext確認用 2行目削除で有効
    print("\ngetResponseの内容 : ",text)     
    #入力ダイアログからの入力内容取得結果例メモ Result(id=6, result={'which': 'positive', 'value': 'なんとかかんとか'}, error=None)
    
          
    ##入力ダイアログの「Ok/Cancel」ボタン判定処理
    
    ###Okが押された場合の処理。"positive"が返る 
    if text.result["which"] == "positive": 
        
        #"value"に対応する値をtextに格納
        text = text.result["value"]
        
        #確認用 2行目削除で有効 
        print("\n入力したtext内容 : ",text)
    
    ###Ok以外を押された時の処理    
    else:
        #確認用 2行目削除で有効
        print("\nキャンセルが押されました。")     
        
        #"value"に対応する値をtextに格納
        text = text.result["value"]
        
    return text
    
###############
#実行
###############
a=input_text()

#確認用 2行目を削除で有効
print("\n関数実行で得られた値 : ",a)

説明・まとめ・その他

コードの2行目にある#qpy:quietはQPythonでQuietScriptsを新規作成すると自動的に記入される部分ですが、それが付くだけでコンソール立ち上がらないモードになります。

従って、#qpy:quietが付いたまま実行しても、コード中にある確認用print関数は機能しません。

見たい場合は面倒ですが2行目全部か、「qpy:quiet」を一旦削除して保存後に実行すれば、スクリプトが実行し終わった後にコンソールが立ち上がって、printの中身を見ることが出来るようになります。

元に戻すときは#qpy:quietを先頭に付け加えればOK。



droid.から始まっている部分が何ヵ所かありますが、これが最初にimport androidhelperインスタンス化してAndroidApiを呼び出している部分です。

それらがどういう働きをしているか、行の先頭#を付けてみて実行すれば動きが確認できるかと思います。


ifの部分は、インプットダイアログでOKを押したときとCancelのときの場合わけ。


実行
コードのqpy:quietのある2行目削除して、コードを実行してみます。

こんなのが画面に出るので、入力。
f:id:chayarokurokuro:20190517234243j:plain




ifで場合わけした部分の違い

OK
した場合の結果

f:id:chayarokurokuro:20190517234648j:plain




Cancel
した場合の結果


f:id:chayarokurokuro:20190517234819j:plain



getResponseの内容 :の部分で取得しprintしたものですが、Result(なんちゃらかんちゃら)と返っています。

OKCancelの違いは、その中のwhichの右側の値がpositivenegativeかです。

もしpositiveなら、どうのこうのその他ならどうちゃらこうちゃらと、その後の処理がここでできます。


Cancelの場合はキャンセルが押されましたとprintする文を書いていたので、それが出ています。


ダイアログに表示できる文字数に制限があるようで、入力ダイアログmakeToast()の文字列の値を長くすると表示が途切れるようです。


今回はここまで。