Есть ли диспетчер событий потерянного фокуса для кивого TextInput? - PullRequest
0 голосов
/ 02 июня 2019

Проблема:

Есть ли способ вызвать событие, если 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()

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

Как только фокус потерян, я хочу, чтобы на вершину моего root class был добавлен пузырь widget.Это даст пользователю возможность сохранить, зашифровать или удалить идентификатор TextInput и текст, который только что потерял фокус, в файл JSON.

Ответы [ 2 ]

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

Проблемы

  1. Несколько экземпляров объекта, Notation. Один из метода build() (return Notation()) в классе App, а другой экземпляр, созданный в методе on_touch_up() (note = Notation()), при возникновении события on_touch_up. Те экземпляры, которые созданы в методе on_touch_up(), не имеют видимого представления, то есть не будут отображаться в окне.
  2. AttributeError: 'ChoiceBubble' object has no attribute 'del_txt_input'
  3. Текст в ChoiceBubble не виден, т. Е. Цвет текста по умолчанию - белый на белом фоне.

* Решения 1021 * Используйте App.get_running_app().root для получения экземпляра root. Заменить root.del_txt_input() на app.root.del_txt_input() Добавить color: 0, 0, 0, 1 к правилу класса, <Label>: Используйте событие on_focus для отображения BubbleButton Отрывки - кв <Label>: color: 0, 0, 0, 1 ... <ChoiceBubble>: ... BubbleButton: text: 'Delete' on_release: app.root.del_txt_input() Snippets - py file 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) выход

Result

0 голосов
/ 02 июня 2019

Событие on_focus будет срабатывать при изменении логического фокуса.

Я попробовал функцию on_touch_up. Но он возвращает экземпляры всех моих TextInputs, а не только текущий виджет.

Это потому, что вы не написали код, который бы ограничивал его виджетом, который вас интересует, вы можете сделать это, если хотите.

...