Python KIVY: как выбрать TextInput без щелчка мышью? - PullRequest
0 голосов
/ 20 мая 2018

Я хочу сделать селектор ввода текста (чтобы на нем мигал курсор), не нажимая на сам ввод текста, а на кнопку.Как это легко сделать?

.py:

import kivy
kivy.require('1.10.0')
from kivy.app import App
from kivy.lang.builder import Builder
from kivy.uix.screenmanager import ScreenManager, Screen

class Main(Screen):

    def __init__(self, **kwargs):
        super(Main, self).__init__(**kwargs)

    def select_textinput(self, instance):
        pass


class GUI(App):

    def build(self):
        sm = ScreenManager()
        sm.add_widget(Main())
        return sm

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

.kv:

#: kivy 1.10.0

<Main>:
    name: "main_screen"

    TextInput:
        id: ti
        text: "Try to put the cursor here without clicking"

    Button:
        text: "Click here to select the text input !"
        on_press: root.select_textinput(ti)

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Решение заключается в следующем.Подробнее см. Фрагменты, пример и выходные данные.

  1. Используйте select_all () , чтобы выделить весь текст, отображаемый в TextInput. Примечание. Если текст отсутствует, то ничего не выбирается.
  2. Используйте cursor = (0, 0) для установки текущей позиции курсора в начале текста
  3. Используйте focus = True для передачифокус на TextInput.
  4. Когда TextInput сфокусирован, выбор отменяется.Поэтому мы задерживаем выделение текста с помощью Clock.schedule_once ()
  5. Заменить on_press на on_release в файле kv, потому что всякий раз, когда нажатие кнопки отпущено, кнопка имеет фокус.
  6. Добавлены дополнительные коды (focus: True, cursor_width: 8) в файле kv

Ввод текста »API» Примечание

Выбор отменяется, когда TextInput находится в фокусе.Если вам нужно показать выделение, когда TextInput сфокусирован, вам следует отложить (использовать Clock.schedule) вызов функций для выбора текста (select_all, select_text).

Snippets

Python Script

def select_textinput(self, instance):
    print("Button Clicked - Select Text")
    instance.cursor = (0, 0)
    instance.focus = True
    Clock.schedule_once(lambda dt: self.select_text(instance, dt=dt), 0.1)

def select_text(self, instance, dt):
    instance.select_all()

kv файл

Button:
    text: "Click here to select the text input !"
    on_release: root.select_textinput(ti)

Пример

main.py

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.clock import Clock


class Main(Screen):

    def select_textinput(self, instance):
        print("Button Clicked - Select Text")
        instance.cursor = (0, 0)
        instance.focus = True
        Clock.schedule_once(lambda dt: instance.select_all())


class GUI(App):

    def build(self):
        sm = ScreenManager()
        sm.add_widget(Main())
        return sm


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

gui.kv

#: kivy 1.10.0

<Main>:
    name: "main_screen"

    BoxLayout:
        orientation: 'vertical'

        TextInput:
            id: ti
            focus: True
            cursor_width: 8  # Default: 1sp
            text: "Try to put the cursor here without clicking"

        Button:
            text: "Click here to select the text input !"
            on_release: root.select_textinput(ti)

Выход

Img01 - App Startup Img02 - Cursor Blinking & Text Selected by click of button

0 голосов
/ 21 мая 2018

Просто установите фокус на True.Но чтобы он продолжал мигать, вы должны запланировать эту функцию:

...
from kivy.clock import Clock
from functools import partial

class Main(Screen):

    def __init__(self, **kwargs):
        super(Main, self).__init__(**kwargs)

    def select_textinput(self, instance):
        Clock.schedule_once(partial(self.keep_blinking, instance), .5)

    def keep_blinking(self, instance, *args):
        instance.focus = True

...
...