简体   繁体   English

为什么将TextInput焦点设置为True会导致TextInput不响应键盘输入?

[英]Why is it that setting TextInput focus equal to True, makes TextInput not respond to keyboard input?

Background: 背景:

I have a button that adds TextInput widgets to a GridLayout with focus: True . 我有一个将TextInput小部件添加到GridLayout的按钮,其focus: True If a TextInput is already present in the layout with focus = True , the previous TextInput is firstly unfocused then a new TextInput is added with focus = True . 如果TextInput与布局已经存在focus = True ,以前TextInput首先是聚焦那么新TextInput加有focus = True

Problem: 问题:

Once a TextInput is added I cannot type even though the cursor is focused on the added TextInput . 添加TextInput即使光标集中在添加的TextInput上,也无法输入。 Secondary problem is when an user clicks on another widget the TextInput stays focused. 第二个问题是,当用户单击另一个小部件时, TextInput保持焦点。 Meaning an unfocus event cannot be fired. 意味着无法触发散焦事件。

Tried: 尝试:

I removed setting the focus explicitly, but then the desired result to start typing after adding a TextInput is lost. 我删除了显式设置焦点的操作,但是添加TextInput之后开始键入所需的结果却丢失了。 Secondary I tried setting unfocus_on_touch = True , but the TextInput stayed focused even after user left the TextInput . 次要的,我尝试设置unfocus_on_touch = True ,但是即使用户离开了TextInput之后, TextInput仍然保持TextInput

Code: 码:

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()


Desired Result: 预期结果:

I want to start typing after adding a new TextInput and after clicking in another widget I want the TextInput to loose focus and fire a unfocus_on_touch event? 我想在添加新的TextInput之后单击其他小部件后开始输入文字,我希望TextInput失去焦点并触发unfocus_on_touch事件吗?

I had the same problem some time ago and I opened an issue at kivy's github page. 前段时间我遇到了同样的问题,我在kivy的github页面上打开了一个问题 There is no solution yet, but there is a workaround. 尚无解决方案,但有解决方法。 You have to add these lines to your TextInput rule: 您必须TextInput添加到TextInput规则中:

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

After that, its working, but with the way you add the widgets you keep focus to all of them all the time, so you have to fix this independently. 在那之后,它开始工作,但是通过添加widgets的方式,您始终可以始终关注所有widgets ,因此您必须独立解决此问题。
The only focus that you need is at your TextInput rule, nowhere else.. 您唯一需要关注的是TextInput规则,无处不在。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM