添加新小部件时如何设置末尾编辑光标?

问题描述 投票:0回答:1

当新的

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() 即可工作。

python urwid
1个回答
0
投票

琼,

这很奇怪。 即使简化你的代码也不起作用:

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。所以也许这是一个错误。

© www.soinside.com 2019 - 2024. All rights reserved.