【问题标题】:Kivy self sizing TextInput (multiline)Kivy 自动调整大小的 TextInput(多行)
【发布时间】:2021-08-23 21:59:47
【问题描述】:

晚上好!

当文本进入下一行时,我试图使 TextInput 小部件的高度增加。问题是,这是在图像内部,它也必须缩放。这就是我要说的:

顺便说一句,每次我输入某个文本时,空格都会像这样在下一行出现:

The quick brown fox jumped over   |
the lazy dog.  The quick brown fox|
 jumped over the lazy dog.  The   |
sly brown fox jumped over the lazy|

有没有办法避免这种情况?

这里是file.kv文件有问题的部分:

#:kivy 1.10.0

<Manager>:
    Chat:
        name: 'chat'
<Chat>:
    canvas:
        Rectangle:
            pos: self.x, 0
            size: self.width, self.height

    Button:
        id: stgs
        background_down: './icons/settings-press.png'
        background_normal: './icons/settings.png'
        border: 0, 0, 0, 0
        always_release: True
        right: root.right - 20
        top: root.top - 10
        size: 40, 40
        size_hint: None, None
        on_release:
            root.manager.transition.direction = 'down'
            root.manager.current = 'settings'

    Button:
        id: bck
        background_down: './icons/back-press.png'
        background_normal: './icons/back.png'
        border: 0, 0, 0, 0
        x: root.x + 20
        top: root.top - 10
        size: 40, 40
        size_hint: None, None
        on_release:
            root.manager.transition.direction = 'right'
            root.manager.current = 'main'

    BoxLayout:
        orientation: 'horizontal'
        padding: 10, 10, 10, 10
        cols: 2
        Image:
            id: inpimg
            source: './icons/user_inp.png'
            x: root.x + 10
            y: root.y + 10
            size: root.width - 40, 40
            size_hint: 0.9, None
            allow_stretch: True
            keep_ratio: False
            TextInput:
                id: usrinp
                valign: 'middle'
                halign: 'left'
                font_size: 16
                multiline: True
                x: root.ids['inpimg'].x + 10
                y: root.ids['inpimg'].y + 5
                background_color: 0, 0, 0, 0
                size: root.width - 80, 33

        Button:
            id: post
            foreground_color: 0, 0, 0, 0
            background_down: './icons/type1-press.png'
            background_normal: './icons/type1.png'
            border: 0, 0, 0, 0
            size: 40, 40
            x: root.width * 14/17 + 5
            y: root.y + 20
            size_hint: None, None

这是最小的 .py 文件:

from kivy.app import App
from kivy.uix.screenmanager import ScreenManager, Screen


class Chat(Screen):
    pass

class Manager(ScreenManager):
    pass

class FileApp(App):
    def build(self):
        return Manager()


if __name__ == "__main__":
    FileApp().run()

如果您知道将文本框放在图像中的更好方法,请告诉我!我想到的这个方法好像有点勉强……

可选问题:kivy 是否可以使用“.gmd”文件?

提前谢谢你!

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    好的,我发现了一些东西。这似乎不是最好的方法,因为里面的文本不能再点击了,但是如果你找到解决这个问题的方法,请告诉我!好的,回到解决方案:

    BoxLayout:
        orientation: 'horizontal'
        padding: 10, 10, 10, 10
        cols: 2
        Image:
            id: inpimg
            source: './icons/user_inp.png'
            x: root.x + 10
            y: root.y + 10
            width: root.width - 40
            height: max(40, scrlv.height)
            size_hint: 0.9, None
            allow_stretch: True
            keep_ratio: False
            ScrollView:
                id: scrlv
                x: root.ids['inpimg'].x + 10
                y: root.ids['inpimg'].y
                width: root.width - 80
                height: (len(usrinp._lines)+1) * usrinp.line_height
                TextInput:
                    id: usrinp
                    valign: 'middle'
                    halign: 'left'
                    font_size: 16
                    multiline: True
                    size_hint: 1, None
                    height: scrlv.height
                    background_color: 0, 0, 0, 0
    

    使用height: (len(usrinp._lines)+1 *usrinp.line_height 将自动调整每个换行符的文本框大小。下面是它的外观:

    另外,如果你想在一定行数之后限制大小,你可以这样做:

    height: (len(usrinp._lines)+1) * usrinp.line_height if (len(usrinp._lines)+1 <= number_of_lines) else number_of_lines * usrinp.line_height
    

    我必须找到一种方法来重新实现滚动条,因为文本只是拒绝通过触摸/点击而上升。

    【讨论】:

      【解决方案2】:

      带有多行 TextInput 的简单示例代码,其高度根据其文本内容动态修改:

      textinputtextsize.kv 文件

      <TextInputTextSize>:
          canvas.before:
              Color:
                  rgb: [0.22,0.22,0.22]
              Rectangle:
                  pos: self.pos
                  size: self.size
          orientation: "vertical"
          textInputSingleLine: txt_input_singleline
          textInputMultiline: txt_input_multiline
      
          GridLayout:
              cols: 1
              canvas.before:
                  Rectangle:
                      pos: self.pos
                      size: self.size
              TextInput:
                  id: txt_input_singleline
                  size_hint_y: None
                  height: "28dp"
                  focus: True
                  multiline: False
                  on_text_validate: root.submitRequest() # ENTER triggers root.submitRequest()
              TextInput:
                  id: txt_input_multiline
                  text: "Audio - ET L'UNIVERS DISPARAÎTRA La nature   \nillusoire de notre réalité et le pouvoir \ntranscendant du véritable pardon \n+ commentaires de Gary Renard"
                  size_hint_y: None
                  height: (len(txt_input_multiline._lines)+1) * txt_input_multiline.line_height
      

      py 文件

      from kivy.app import App
      from kivy.properties import ObjectProperty
      from kivy.uix.boxlayout import BoxLayout
      
      
      class TextInputTextSize(BoxLayout):
          textInput = ObjectProperty()
          textInputMultiline = ObjectProperty()
      
          def submitRequest(self):
              # Get the request from the TextInput
              textInputTxt = self.textInputSingleLine.text
              self.textInputMultiline.text += '\n' + textInputTxt
      
      class TextInputTextSizeApp(App):
          def build(self):
              return TextInputTextSize()
      
      if __name__ == '__main__':
          TextInputTextSizeApp().run()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-12
        • 2016-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多