这看起来像是有用的东西,也许我已经错过了,但是Kivy Textinput有一个等同于tkinter的Text.see(END)
的方法吗?我看了do_cursor_movement
,但这只是移动光标,而不是显示的内容。
答案 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滚动到底部。