Отключение переноса текста в TextInput

#python #kivy

#python #kivy

Вопрос:

Есть ли способ отключить перенос текста в виджете TextInput? То есть я все еще хотел бы иметь разрывы строк, но я не хочу переносить слова внутри абзаца. Похоже, multiline=False это не то, что я ищу

Обновление: я имею в виду, что в Windows (например, Windows 7) есть опция «Перенос текста» в Microsoft Notepad (формат — перенос текста). Я хочу отключить эту опцию в kivy TextInput

Комментарии:

1. Вы хотите горизонтальную прокрутку в TextInput ?

2. @джон-Андерсон Я имею в виду, что в Windows (например, Windows 7) есть опция «Перенос текста» в Microsoft Notepad (формат — перенос текста). Я хочу отключить эту опцию в kivy TextInput

3. Итак, что вы хотите, чтобы TextInput отображалось при вводе строки, длина которой превышает ширину TextInput ?

4. строка продолжается вправо, вы можете перемещаться по ней вправо и обратно влево (к началу строки), точно так же, как это может делать блокнот Windows

Ответ №1:

Я не использую Windows, но для меня это звучит как горизонтальная прокрутка. TextInput Выполняет горизонтальную прокрутку по умолчанию, если вы установили multiline значение False , но не тогда, когда multiline значение True. Итак, вот способ поместить a TextInput внутри a ScrollView для обеспечения горизонтальной прокрутки, когда multiline значение True:

 from kivy.app import App
from kivy.lang import Builder
from kivy.properties import NumericProperty
from kivy.uix.scrollview import ScrollView
from kivy.uix.textinput import TextInput


class MyTextInput(TextInput):
    minimum_width = NumericProperty(1)

    def on_cursor(self, instance, newPos):
        # determine scroll position of parent ScrollView if multiline is True
        if not (isinstance(self.parent, ScrollView) and self.multiline):
            return super(MyTextInput, self).on_cursor(instance, newPos)
        if newPos[0] == 0:
            self.parent.scroll_x = 0
        else:
            over_width = self.width - self.parent.width
            if over_width <= 0.0:
                return super(MyTextInput, self).on_cursor(instance, newPos)
            view_start = over_width * self.parent.scroll_x
            view_end = view_start   self.parent.width
            offset = self.cursor_offset()
            desired_view_start = offset - 5
            desired_view_end = offset   self.padding[0]   self.padding[2]   self.cursor_width   5
            if desired_view_start < view_start:
                self.parent.scroll_x = max(0, desired_view_start / over_width)
            elif desired_view_end > view_end:
                self.parent.scroll_x = min(1, (desired_view_end - self.parent.width) / over_width)
        return super(MyTextInput, self).on_cursor(instance, newPos)

    def on_text(self, instance, newText):
        # calculate minimum width
        width_calc = 0
        for line_label in self._lines_labels:
            width_calc = max(width_calc, line_label.width   20)   # add 20 to avoid automatically creating a new line
        self.minimum_width = width_calc


theRoot = Builder.load_string('''
ScrollView:
    id: scroller
    effect_cls: 'ScrollEffect'  # keeps from scrolling to far
    MyTextInput:
        size_hint: (None, 1)
        width: max(self.minimum_width, scroller.width)
''')

class TI_in_SV(App):
    def build(self):
        return theRoot

TI_in_SV().run()
  

Обратите внимание, что это MyTextInput расширяется TextInput .

Комментарии:

1. Интересное решение! Есть ли у вас какие-либо идеи, как избавиться от перехода от начала строки (к левому краю) при вводе чего-либо или перемещении курсора в конец строки? У меня эта проблема в Linux (Ubuntu)

2. Я изменил свой ответ, чтобы попытаться устранить «прыжки».

3. Можете ли вы сделать обратное? Отключить прокрутку, когда многострочное значение равно false, чтобы вы все еще могли использовать on_text_validate?