2023年8月27日 星期日

Kivy UIX篇 widget篇 TextInput類 method篇 講解

若尚未看過Kivy UIX篇 widget篇 TextInput類  attribute篇 講解,建議看完之後對TextInput有一定了解在看這篇喔。

根據官網TextInput類繼承自kivy.uix.behaviors.focus.FocusBehavior與kivy.uix.widget.Widget,因此TextInput的method皆來自這兩類。詳細的可以參考Kivy UIX篇 widget篇 widget類 method篇 講解,基本上是通用的。

TextInput類專用method有以下幾個:

1.on_text_validate:當multiline=False時才可以使用此Interaction,當輸入完文字後按下Enter鍵及觸發此method

在main.py中寫下程式碼:

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.properties import ObjectProperty


class MyLayout(GridLayout):
    a1 = ObjectProperty(None)
    a2 = ObjectProperty(None)

    def btn1(self):
        self.a2.text = 'you type \'{}\' in textinput'.format(self.a1.text)


class Myapp(App):

    def build(self):
        return MyLayout()


if __name__ == '__main__':
    Myapp().run()

btn1函數代表:觸發此函數時將a2的text屬性指定為'you type \'{}\' in textinput'.format(self.a1.text)

在my.kv中寫下此段程式碼:

<MyLayout>:
    a1: b1
    a2: b2

    rows: 2

    TextInput:
        id: b1
        multiline: False
        on_text_validate: root.btn1() #當游標在此TextInput且按下Enter鍵後觸btn1函數

    Label:
        id: b2
        font_size: 40
        text: ''

執行結果如下:

2.

on_double_tap(雙擊Text Input時觸發,預設為選擇光標位置周圍的文本)、

on_triple_tap(連續三次點擊Text Input時觸發,預設為選擇光標位置的整行文字'注意:必須要存在下一行才可以觸發(我猜是程式要確認有換行符號)')

on_quad_touch(當四根手指同時觸摸Text Input時觸發,預設為選擇全部文字)

我們可以自己定義當Text Input被雙擊、連續三次點擊、四根手指同時觸摸時的event,但我建議不要,因為預設的event與我們平常的使用習慣相同,因此沒必要更改,若有需要請自行更改,這邊不另外示範。

3.delete_selection(from_undo=False):刪除被選取的文字

在main.py中寫下程式碼:

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.properties import ObjectProperty


class MyLayout(GridLayout):
    a1 = ObjectProperty(None)
    a2 = ObjectProperty(None)

    def btn1(self):
        self.a1.delete_selection(from_undo=False)


class Myapp(App):
    def build(self):
        return MyLayout()


if __name__ == '__main__':
    Myapp().run()

btn1函數內容為:a1物件呼叫delete_selection()方法

在my.kv中寫下此段程式碼:

<MyLayout>:
    a1: b1
    a2: b2

    rows: 2

    TextInput:
        id: b1

    Button:
        id: b2
        text: 'press me'
        on_press: root.btn1()

執行結果如下:

4.select_all():選取Text Input內所有文字

在main.py中寫下程式碼:

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.properties import ObjectProperty


class MyLayout(GridLayout):
    a1 = ObjectProperty(None)
    a2 = ObjectProperty(None)

    def btn1(self):
        self.a1.select_all()


class Myapp(App):
    def build(self):
        return MyLayout()


if __name__ == '__main__':
    Myapp().run()

btn1函數內容為:a1物件呼叫select_all()方法

在my.kv中寫下此段程式碼:

<MyLayout>:

    a1: b1
    a2: b2

    rows: 2

    TextInput:
        id: b1

    Button:
        id: b2
        text: 'press me'
        on_press: root.btn1()

執行結果如下:

5.select_text(start, end):選擇從index為start到end的文字(我目前測試的結果,只能作用在第一行......)

在main.py中寫下程式碼:

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.properties import ObjectProperty


class MyLayout(GridLayout):
    a1 = ObjectProperty(None)
    a2 = ObjectProperty(None)

    def btn1(self):
        self.a1.select_text(2,6)


class Myapp(App):

    def build(self):
        return MyLayout()


if __name__ == '__main__':
    Myapp().run()

btn1函數內容為:a1物件呼叫select_text()方法,此例select_text(2,6)代表選取第三個到第六個文字。(至於為什麼是第三個到第六個,我猜應該可以與python中的range用法類比)

在my.kv中寫下此段程式碼:

<MyLayout>:

    a1: b1
    a2: b2

    rows: 2

    TextInput:
        id: b1

    Button:
        id: b2
        text: 'press me'
        on_press: root.btn1()

執行結果如下:


沒有留言:

張貼留言

精選文章

Kivy UIX篇 widget篇 TabbedPanel類 event篇 講解