【问题标题】:How to make editable label work in kivy如何使可编辑标签在 kivy 中工作
【发布时间】:2018-03-02 13:43:40
【问题描述】:

以下代码将打开顶部带有标签的窗口,一旦单击它,标签就会变为文本输入。

但是,一旦您开始键入并插入第一个键(任何键),文本就会缩短,并且您会突然丢失部分文本。例如:您单击标签 > 出现文本输入 > 键入“1” > 文本变为“按此处然后尝试 1”。

如何更改以下代码以阻止文本消失?

import kivy
kivy.require('1.10.1')

from kivy.uix.floatlayout import FloatLayout
from kivy.uix.textinput import TextInput
from kivy.uix.label import Label
from kivy.base import runTouchApp
from kivy.properties import BooleanProperty, ObjectProperty

#https://github.com/kivy/kivy/wiki/Editable-Label
class EditableLabel(Label):

    edit = BooleanProperty(False)

    textinput = ObjectProperty(None, allownone=True)

    def on_touch_down(self, touch):
        if self.collide_point(*touch.pos) and not self.edit:
            self.edit = True
        return super(EditableLabel, self).on_touch_down(touch)

    def on_edit(self, instance, value):
        if not value:
            if self.textinput:
                self.remove_widget(self.textinput)
            return
        self.textinput = t = TextInput(
                text=self.text, size_hint=(None, None),
                font_size=self.font_size, font_name=self.font_name,
                pos=self.pos, size=self.size, multiline=False)
        self.bind(pos=t.setter('pos'), size=t.setter('size'))
        self.add_widget(self.textinput)
        t.bind(on_text_validate=self.on_text_validate, focus=self.on_text_focus)

    def on_text_validate(self, instance):
        self.text = instance.text
        self.edit = False

    def on_text_focus(self, instance, focus):
        if focus is False:
            self.text = instance.text
            self.edit = False

if __name__ == '__main__':

    root = FloatLayout()

    lbl = 'Press here and then try to edit (type a character), but text gets shortened suddenly.'
    label = EditableLabel(text=lbl, size_hint_y=None, height=50, pos_hint={'top': 1})
    root.add_widget(label)

    runTouchApp(root)

【问题讨论】:

    标签: python label kivy


    【解决方案1】:

    根据docs

    当光标位置改变时,选择会自动更新。您可以从 TextInput.selection_text 属性中获取当前选中的文本。

    在您的情况下,当您单击标签并出现在 TextInput 中时,光标会更改位置,因此选择了文本。当一个文本被选中并且你写的东西被替换时,这就是文本消失的原因。

    解决办法是清理选区:

    from kivy.clock import Clock
    
    class EditableLabel(Label):
        [...]
        def on_edit(self, instance, value):
            if not value:
                if self.textinput:
                    self.remove_widget(self.textinput)
                return
            self.textinput = t = TextInput(
                    text=self.text, size_hint=(None, None),
                    font_size=self.font_size, font_name=self.font_name,
                    pos=self.pos, size=self.size, multiline=False)
            self.bind(pos=t.setter('pos'), size=t.setter('size'))
            self.add_widget(self.textinput)
            t.bind(on_text_validate=self.on_text_validate, focus=self.on_text_focus)
            Clock.schedule_once(lambda dt: self.textinput.cancel_selection())
    

    【讨论】:

      猜你喜欢
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 2016-09-10
      • 2013-04-27
      • 2014-10-23
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多