#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?