Почему при установке фокуса TextInput равным True, TextInput не реагирует на ввод с клавиатуры? - PullRequest
0 голосов
/ 01 июня 2019

Справочная информация:

У меня есть кнопка, которая добавляет TextInput виджеты к GridLayout с focus: True. Если TextInput уже присутствует в макете с focus = True, предыдущий TextInput сначала не фокусируется, затем добавляется новый TextInput с focus = True.

Проблема:

После добавления TextInput я не могу печатать, даже если курсор сфокусирован на добавленном TextInput. Вторичная проблема - когда пользователь нажимает на другой виджет, TextInput остается в фокусе. Это означает, что событие не в фокусе не может быть запущено.

Пробовал:

Я убрал настройку фокуса явно, но тогда нужный результат, чтобы начать печатать после добавления TextInput, потерян. Вторичный Я попытался установить unfocus_on_touch = True, но TextInput оставался сфокусированным даже после того, как пользователь оставил TextInput.

Код:

import kivy
kivy.require("1.10.1")

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.properties import ObjectProperty
from kivy.uix.textinput import TextInput
from kivy.uix.bubble import Bubble
from kivy.lang import Builder

Builder.load_string('''
#: import Window kivy.core.window.Window
<Button>:
    background_normal: ''
<Label>:
    canvas.before:
        Color:
            rgba: (0,0.59,0.36,1)
        Rectangle:
            pos: self.pos
            size: self.size
<TextInput>:
    hint_text: 'Nuwe nota'
    font_size: self.height / 4.5 if self.focus else self.height / 3
    background_normal: ''
    background_active: ''
    focus: True
    foreground_color: (0,0.61,0.36,1) if self.focus else (0.71,0.75,0.71,1)
    canvas.after:
        Color:
            rgb: (0,0,0,1)
        Line:
            points: self.pos[0] , self.pos[1], self.pos[0] + self.size[0], self.pos[1]
    size_hint_y: None
    height: Window.height / 6 if self.focus else Window.height / 12
<ChoiceBubble>:
    orientation: 'horizontal'
    size_hint: (None, None)
    size: (160, 120)
    pos_hint: {'top': 0.2, 'right': 0.8}
    arrow_pos: 'top_left'
    BubbleButton:
        text: 'Save'
    BubbleButton:
        text: 'Encrypt..'
    BubbleButton:
        text: 'Delete'
        on_release: root.del_txt_input()
<Notation>:
    canvas:
        Color:
            rgba: (0,0.43,0.37,1)
        Rectangle:
            pos: self.pos
            size: self.size
    Label:
        pos_hint: {'top': 1, 'right': 0.8}
        size_hint: [0.8, None]
        height: Window.height / 15
    Button:
        text: 'Set'
        color: (0,0,0,1)
        pos_hint: {'top': 1, 'right': 0.9}
        size_hint: [0.1, None]
        height: Window.height / 15

    Button:
        text: '+ Plus'
        color: (0,0,0,1)
        pos_hint: {'top': 1, 'right': 1}
        size_hint: [0.1, None]
        height: Window.height / 15
        on_release: root.add_input()
    ScrollView:
        size_hint_y: None
        size: Window.width, Window.height
        pos_hint: {'top': 0.92, 'right': 1}
        GridLayout:
            id: text_holder
            cols: 1
            pos_hint: {'top': 0.92, 'right': 1}
            padding: 4
            size_hint_x: 1
            size_hint_y: None
            height: self.minimum_height

''')
class ChoiceBubble(Bubble):
    pass
class Notation(FloatLayout):
    which_txt = ObjectProperty(None)
    new_txt = ObjectProperty(None)
    def add_input(self):
        txt_hld = self.ids.text_holder
        if self.new_txt == None:
            self.new_txt = TextInput()
            txt_hld.add_widget(self.new_txt)
        else:
            self.new_txt.focus = False
            print(self.new_txt.focus)
            self.new_txt = TextInput(focus = True)
            print(self.new_txt.focus)
            txt_hld.add_widget(self.new_txt)
    def que_txt_input(self, instance):
        self.which_txt = instance
        print(instance)
    def del_txt_input(self):
        print(self.which_txt)

class theNoteApp(App):
    title = 'My Notes'
    def build(self):
        return Notation()

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


Желаемый результат:

Я хочу начать печатать после добавления нового TextInput и после нажатия на другой виджет, я хочу, чтобы TextInput потерял фокус и вызвал событие unfocus_on_touch?

1 Ответ

1 голос
/ 01 июня 2019

У меня была такая же проблема некоторое время назад, и я открыл проблему на странице github kivy.Пока нет решения, но есть обходной путь.Вы должны добавить эти строки к своему правилу TextInput:

keyboard_mode: 'managed'
keyboard_on_key_down: self.show_keyboard()

После этого оно заработает, но с тем, как вы добавляете widgets, вы все время фокусируетесь на всех них, поэтомуВы должны исправить это самостоятельно.
Единственное, что вам нужно, это ваше правило TextInput, больше нигде ..

...