当新的
Edit.edit_text
小部件添加到 Edit
时,我尝试将光标设置在 ListBox
的末尾。我尝试用set_cursor_end()
末尾的函数new_line()
将其设置为最后一个位置,但似乎不起作用。
import urwid
from selectable_edit import SelectableEdit
class NewLine(urwid.ListBox):
def __init__(self):
body = urwid.SimpleFocusListWalker([])
super(NewLine, self).__init__(body)
self.current_widget = None
self.pos = -1
self.new_line()
def add( self, widget) :
self.pos += 1
self.body.insert( self.pos, widget )
self.set_focus( self.pos )
def new_line( self ) :
widget = urwid.Edit(('I say', u"What is your name?: "), "Test")
self.current_widget = widget
self.add( widget )
self.set_cursor_end()
def set_cursor_end( self ):
text = self.current_widget.edit_text
self.current_widget.edit_pos = len( text )
def set_cursor_begin( self ):
self.current_widget.edit_pos = 0
def keypress(self, size, key):
key = super(NewLine, self).keypress(size, key)
if key == 'tab' or key == 'ctrl right':
self.set_cursor_end()
elif key == 'ctrl left':
self.set_cursor_begin()
elif key != 'enter':
return key
else :
self.new_line()
palette = [('I say', 'default,bold', 'default'),]
urwid.MainLoop(NewLine(), palette).run()
在此示例中,当按 Enter 时,最后一个小部件将获得焦点,但光标位置始终与之前相同,而不是行尾。
此外,按下
Tab时,
set_cursor_end()
即可工作。
琼,
这很奇怪。 即使简化你的代码也不起作用:
import urwid
listbox = urwid.ListBox( urwid.SimpleListWalker( [] ) )
edit = urwid.Edit( u"What is your name?: ", "John")
listbox.body.insert( 0, edit )
listbox.set_focus( 0 )
edit.edit_pos = 4
edit = urwid.Edit( u"What is your name?: ", "Mary" )
listbox.body.insert( 1, edit )
listbox.set_focus( 1 )
edit.edit_pos = 3
edit = urwid.Edit( u"What is your name?: ", "Alex" )
listbox.body.insert( 2, edit )
listbox.set_focus( 2 )
edit.edit_pos = 1
urwid.MainLoop(listbox).run()
它保留最后一个 Edit() 小部件的光标位置。
我已经阅读了官方的Urwid 2.6.10教程我已经通过更改功能修改了名为“多个问题”的示例:
def question():
return urwid.Pile( [urwid.Edit(("I say", "What is your name?\n"), "Mary", edit_pos=1) ] )
而且它也不起作用。 Listbox() 中的每个新的 Edit() 小部件都保留最后的 Edit() 位置,而不是按照指示使用 pos=1。所以也许这是一个错误。