質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.62%

pythonisra UI

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 860

shinya-ta

score 10

pythonista UIで簡単なキーボードアプリを作ろうとしています。

textviewでのカーソルの移動(→、←、↑、↓、文末まで戻る、文字の削除)だけをできるアプリを考え中です。

UIでのコードの紐付けと、カーソル自体のコードが判らなくて困っています。

このアプリは、全盲の嫁が使用するiPhoneでの使用予定です。

iPhoneでは、テキスト入力の際、カーソルの移動(進む、戻る)がない為に、アクセシビリティの音声機能を使用すると、文字入力を間違えてしまうと、そこまで削除しないといけないという状態になり、(音声がかかった状態では、3DTouchの機能が使いにくい)それでは、キーボードを切り替えて、カーソルを移動すれば?と思いついた次第です。

制作は主にiPad上での、pythonistaでの制作が主となっていますり

週末での僅かな時間での勉強、制作ですので、なかなか思うようにいかず、困っています。

どなたか、教えて頂けないでしょうか?

宜しくお願いします。

以前、こういうのを探しだして試したところ、buttonが定義されていないとのないようのエラーが出ました。

出先からの投稿ですので、詳細なエラーメッセージは後で載せますが、どこが悪いのかが、さっぱりわかりません。

 -*- coding: utf-8 -*-

import ui

DEFAULT_TEXT = "w\n\nw w WWWW w w\n\nw"
DEFAULT_LEN = len(DEFAULT_TEXT)
DEFAULT_MID = DEFAULT_LEN/2
DEFAULT_RNG = (DEFAULT_MID, DEFAULT_MID)

class KBControlDelegate(object):
def init(self):
self.bksp = False

def keypress(self, key):
out.text += key + " "

def textview_should_change(self, textview, range, replacement):
if replacement == "":

 some deletion

if range == (DEFAULT_MID-1, DEFAULT_MID):
self.keypress("bksp")
elif len(replacement) > 1:

 paste

self.keypress("cmd-v")
else:
self.keypress(replacement)
return False

def textview_did_change_selection(self, textview):
nop = False
if len(ctrl.text) == DEFAULT_LEN:

 no change to text, only selection

if ctrl.selected_range == DEFAULT_RNG:

 no important changes, cursor was likely reset by script

nop = True
elif ctrl.selected_range[0] == ctrl.selected_range[1]:

 shift was not used

if ctrl.selected_range == (0, 0):

 cursor is at the top

self.keypress("cmd-up")
elif ctrl.selected_range in ((1, 1), (2, 2)):

 cursor is near the top

self.keypress("up")
elif ctrl.selected_range == (3, 3):

 cursor is at the left

self.keypress("cmd-left")
elif ctrl.selected_range == (DEFAULT_LEN/2-2, DEFAULT_LEN/2-2):

 cursor is exactly two chars to the left

self.keypress("alt-left")
elif ctrl.selected_range == (DEFAULT_LEN/2-1, DEFAULT_LEN/2-1):

 cursor is exactly one char to the left

self.keypress("left")
elif ctrl.selected_range == (DEFAULT_LEN/2+1, DEFAULT_LEN/2+1):

 cursor is exactly one char to the right

self.keypress("right")
elif ctrl.selected_range == (DEFAULT_LEN/2+2, DEFAULT_LEN/2+2):

 cursor is exactly two chars to the right

self.keypress("alt-right")
elif ctrl.selected_range == (DEFAULT_LEN-3, DEFAULT_LEN-3):

 cursor is at the right

self.keypress("cmd-right")
elif ctrl.selected_range in ((DEFAULT_LEN-2, DEFAULT_LEN-2), (DEFAULT_LEN-1, DEFAULT_LEN-1)):

 cursor is near the bottom

self.keypress("down")
elif ctrl.selected_range == (DEFAULT_LEN, DEFAULT_LEN):

 cursor is at the bottom

self.keypress("cmd-down")
else:

 some unhandled movement

nop = True
self.keypress(str(ctrl.selected_range))
else:

 shift was used

if ctrl.selected_range == (0, DEFAULT_MID):

 cursor is at the top

self.keypress("shift-cmd-up")
elif ctrl.selected_range in ((1, DEFAULT_MID), (2, DEFAULT_MID)):

 cursor is near the top

self.keypress("shift-up")
elif ctrl.selected_range == (3, DEFAULT_MID):

 cursor is at the left

self.keypress("shift-cmd-left")
elif ctrl.selected_range == (DEFAULT_LEN/2-2, DEFAULT_MID):

 cursor is exactly two chars to the left

self.keypress("shift-alt-left")
elif ctrl.selected_range == (DEFAULT_LEN/2-1, DEFAULT_MID):

 cursor is exactly one char to the left

self.keypress("shift-left")
elif ctrl.selected_range == (DEFAULT_MID, DEFAULT_LEN/2+1):

 cursor is exactly one char to the right

self.keypress("shift-right")
elif ctrl.selected_range == (DEFAULT_MID, DEFAULT_LEN/2+2):

 cursor is exactly two chars to the right

self.keypress("shift-alt-right")
elif ctrl.selected_range == (DEFAULT_MID, DEFAULT_LEN-3):

 cursor is at the right

self.keypress("shift-cmd-right")
elif ctrl.selected_range in ((DEFAULT_MID, DEFAULT_LEN-2), (DEFAULT_MID, DEFAULT_LEN-1)):

 cursor is near the bottom

self.keypress("shift-down")
elif ctrl.selected_range == (DEFAULT_MID, DEFAULT_LEN):

 cursor is at the bottom

self.keypress("shift-cmd-down")
else:

 some unhandled movement

nop = True
self.keypress(str(ctrl.selected_range))

elif len(ctrl.text) == DEFAULT_LEN - 1:

 exactly one character was removed

 due to the nature of bksp, this is only triggered for delete (fn-bksp)

self.keypress("del")
elif len(ctrl.text) < DEFAULT_LEN:

 more than one character was deleted, i. e. alt-bksp

self.keypress("alt-bksp")
elif len(ctrl.text) > DEFAULT_LEN:

 one or more characters were added and not handled by should_change

 i. e. sticky key/accentuation character, need manual reset of control field

 accented chars can still be typed

pass
else:

 some unknown situation

out.text += "\nSome unhandled situation: " + ctrl.selected_range + "\n" + ctrl.text + "\n\n"

if not nop:
ctrl.text = DEFAULT_TEXT
ctrl.selected_range = DEFAULT_RNG

def run():
global root
global ctrl
global out
root = ui.load_view()
ctrl = root["ctrl"]
out = root["out"]
ctrl.delegate = KBControlDelegate()

root.present("sheet")

if name == "main":
run()

このようなエラーメッセージがでました。
しかも、2つ同時にです。

Warning: Could not bind action: name 'buttontap_up' is not defined
Warning: Could not bind action: name 'buttontap_left' is not defined
Warning: Could not bind action: name 'buttontap_right' is not defined
Warning: Could not bind action: name 'buttontap_return' is not defined
Warning: Could not bind action: name 'buttontap_down' is not defined
Warning: Could not bind action: name 'bottontap_backspace' is not defined
Warning: Could not bind action: unexpected EOF while parsing (<string>, line 1)
Warning: Could not bind action: name 'buttontap_up' is not defined
Warning: Could not bind action: name 'buttontap_left' is not defined
Warning: Could not bind action: name 'buttontap_right' is not defined
Warning: Could not bind action: name 'buttontap_return' is not defined
Warning: Could not bind action: name 'buttontap_down' is not defined
Warning: Could not bind action: name 'bottontap_backspace' is not defined
Warning: Could not bind action: unexpected EOF while parsing (<string>, line 1)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tiitoi

    2018/10/01 19:34

    まずご自身で取り組まれて、具体的に困っている点を提示していただけないと回答できないと思います。

    キャンセル

  • shinya-ta

    2018/10/02 19:18

    返答ありがとうございます。文章で具体的に書いたつもりでしたが、ちゃんと伝わらなかったようで、申し訳ありませんでした。

    キャンセル

回答 1

checkベストアンサー

0

pythonistaマニュアルも読んでいませんが、textviewというコントロールがあるのであれば、それに関するドキュメントを読み、カーソル関連の制御ができそうなものをピックアップなさそうであれば、その親のコントロールにないかを探す

あたりをつけたら、そのAPIなどの名称でググり、使い方が出ていないか確認
自分で試して見て、所望の動作をするか確認
このタイミングでまだ解決できなければ、自分で確認した内容を提示した上でご質問されるとよろしいのではないでしょうか。

ちなみに、ネイティブであれば、Keyboard Extensionや、adjustTextPositionByCharacterOffsetがキーワードになりそうです。
pythonistaに当該APIの代替ができればできるかもしれませんね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/02 19:21

    返答ありがとうございます。ググるキーワードすら、どうしていいか判らず、とりあえず思いつくキーワードでググりながら、書籍を読んでました。
    早速、ヒントになりそうな項目を探してみます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る