繁体   English   中英

是否有针对焦点的TextInput的焦点丢失事件分配器?

[英]Is there a focus lost event dispatcher for a kivy TextInput?

问题:

如果multiline = True TextInput失去了焦点,是否有办法触发事件?

背景:

我已经尝试过on_touch_up函数。 但是它返回所有TextInputs的实例,而不仅仅是当前的小部件。 我尝试了text_validate_unfocus = False ,结果相同。

码:

import kivy
kivy.require("1.10.1")

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.properties import ObjectProperty, NumericProperty
from kivy.uix.textinput import TextInput
from kivy.uix.bubble import Bubble
from kivy.lang import Builder
from kivy.storage.jsonstore import JsonStore

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: ''
    foreground_color: (0,0.61,0.36,1) if self.focus else (0.71,0.75,0.71,1)
    unfocus_on_touch: False
    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:
        color: (0,0,0,1)
        pos_hint: {'top': 1, 'right': 0.9}
        size_hint: [0.1, None]
        height: Window.height / 15
        Image:
            source: 'gear_2.png'
            center_y: self.parent.center_y
            center_x: self.parent.center_x
            size: self.parent.width /1.5, self.parent.height/ 1.5
            allow_stretch: True
    Button:
        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()
        Image:
            source: 'plus_text12354.png'
            center_y: self.parent.center_y
            center_x: self.parent.center_x
            size: self.parent.width /1.5, self.parent.height/ 1.5
            allow_stretch: True
    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 TextInput(TextInput):
    got_txt = ObjectProperty(None)
    def on_touch_up(self, touch):
        if not self.collide_point(*touch.pos):
            self.text_validate_unfocus = False
            note = Notation()
            note.show_bubble
            self.got_txt=note.que_txt_input(self)
        return super(TextInput, self).on_touch_up(touch)
class Notation(FloatLayout):
    which_txt = ObjectProperty(None)
    new_txt = ObjectProperty(None)
    cnt = NumericProperty(0)
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.the_file=JsonStore('txt_input.json')
        self.cnt = self.the_file.count()
        lst = self.the_file.keys
    def add_input(self):
        txt_hld = self.ids.text_holder
        self.cnt += 1
        self.new_txt = TextInput(id=str(self.cnt))
        self.the_file.put(str(self.cnt), the_id=str(self.cnt), the_input='')
        txt_hld.add_widget(self.new_txt)
    def que_txt_input(self, instance):
        self.which_txt = instance
        print(instance.text, instance)
        return instance
    def del_txt_input(self):
        print(self.which_txt)
    def the_file(self, notestore):
        self.notestore = notestore
    def show_bubble(self):
        self.add_widget(ChoiceBubble())
    def get_store(self):
        the_keys = list(self.the_file.keys)
        print(the_keys)
        return the_keys

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

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

所需结果:

一旦失去焦点,我希望将气泡widget添加到root class的顶部。 这将使用户可以选择将刚刚失去焦点的TextInput id和文本保存,加密或删除到JSON文件中。

问题

  1. 对象Notation多个实例。 每当on_touch_up事件时,一个方法都来自App类的build()方法( return Notation() ),另一个是on_touch_up()方法创建的另一个实例( note = Notation() )。 on_touch_up()方法中创建的那些实例没有可见的视图,即它不会显示在窗口中。
  2. AttributeError: 'ChoiceBubble' object has no attribute 'del_txt_input'
  3. ChoiceBubble文本不可见,即默认的文本颜色是白色背景上的白色。

解决方案

  1. 使用App.get_running_app().root获取实例化的根。
  2. root.del_txt_input()替换app.root.del_txt_input()
  3. color: 0, 0, 0, 1添加到类别规则<Label>:
  4. 使用on_focus事件显示BubbleButton

片段-KV

<Label>:
    color: 0, 0, 0, 1
    ...

<ChoiceBubble>:
    ...
    BubbleButton:
        text: 'Delete'
        on_release: app.root.del_txt_input()

片段-py文件

class TextInput(TextInput):
    got_txt = ObjectProperty(None)

    def on_focus(self, instance, value):
        if not value:   # defocused
            note = App.get_running_app().root
            note.show_bubble()
            self.got_txt = note.que_txt_input(self)

产量

结果

当焦点布尔值更改时,将触发on_focus事件。

我已经尝试过on_touch_up函数。 但是它返回我所有TextInput的实例,而不仅仅是当前的小部件。

这是因为您没有编写任何代码来将其限制为您关注的窗口小部件,因此可以根据需要执行此操作。

暂无
暂无

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

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