I have a button that adds TextInput
widgets to a GridLayout
with 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
.
Once a TextInput
is added I cannot type even though the cursor is focused on the added TextInput
.
Secondary problem is when an user clicks on another widget the TextInput
stays focused. Meaning an unfocus event cannot be fired.
I removed setting the focus explicitly, but then the desired result to start typing after adding a TextInput
is lost.
Secondary I tried setting unfocus_on_touch = True
, but the TextInput
stayed focused even after user left the 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()
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?
答案 0 :(得分:1)
前段时间我遇到了同样的问题,我在kivy的github页面上打开了一个issue。
尚无解决方案,但有解决方法。
您必须将这些行添加到您的TextInput
规则中:
keyboard_mode: 'managed'
keyboard_on_key_down: self.show_keyboard()
此后,它开始工作,但是通过添加widgets
的方式,您始终将精力集中在所有这些对象上,因此您必须独立解决此问题。
您唯一需要关注的是您的TextInput
规则,无处不在。