Kivy textinput看到结束

时间:2014-04-16 14:06:54

标签: python tkinter kivy

这看起来像是有用的东西,也许我已经错过了,但是Kivy Textinput有一个等同于tkinter的Text.see(END)的方法吗?我看了do_cursor_movement,但这只是移动光标,而不是显示的内容。

3 个答案:

答案 0 :(得分:1)

我根本不熟悉Kivy,也没有测试我的答案,但如果我正确理解docs,只需将属性cursor设置为结束line可以做你想做的事。

引用:

  

光标

Tuple of (row, col) values indicating the current cursor position.
     

如果要移动光标,可以设置新的(行,列)。该   滚动区域将自动更新以确保光标   在视口内可见。

答案 1 :(得分:1)

我发现光标没有正确设置与启动时的显示相关的错误 - 在下面的示例中,将行添加到TextInput后,光标显示为(0, 100),即使实际显示文本的顶部。这会导致“底部”按钮无效 - 直到您单击TextInput(更改光标位置)或点击“顶部”按钮。

要了解我的意思,请注释掉Clock.schedule_once(lambda _: setattr(root.ids['ti'], 'cursor', (0, 0)))

我已在Ubuntu 14.04上测试此代码与Kivy 1.8.1-dev(git:1149da6bf26ff5f27536222b4ba6a874456cde6e)一起使用:

import kivy
kivy.require('1.8.1')

from kivy.app import App
from kivy.lang import Builder
from kivy.clock import Clock

root = Builder.load_string('''
BoxLayout:
    orientation: 'vertical'

    BoxLayout:
        TextInput:
            id: ti

        Label:
            size_hint_x: None
            width: sp(80)
            text: str(ti.cursor)

    BoxLayout:
        size_hint_y: None
        height: sp(128)

        Widget

        Button:
            text: 'Top'
            on_press: ti.cursor = (0, 0)
        Button:
            text: 'Bottom'
            on_press: ti.cursor = (0, len(ti._lines) - 1)

        Widget
''')

class TestApp(App):
    def build(self):
        text = ''
        for i in xrange(100):
            text += 'Line %d\n' % (i + 1,)
        root.ids['ti'].text = text

        # fix the cursor pos
        Clock.schedule_once(lambda _: setattr(root.ids['ti'], 'cursor', (0, 0)))
        return root

if __name__ == '__main__':
    TestApp().run()

答案 2 :(得分:1)

我发现通过使用包含TextInput的ScrollView解决了这个问题。使用.kv文件中的以下内容

ScrollView:
    id: scroll1
    size_hint_x: 0.6
    TextInput:
        readonly: True
        id: main
        size_hint: 1, None
        height: max(self.minimum_height, scroll1.height)

然后所有人需要做的就是调用self.ids['scroll1'].scroll_y = 0这会将TextInput滚动到底部。