Python Urwid按键

Python Urwid按键,python,urwid,Python,Urwid,各位晚上好, 我有一个使用Python Urwid库构建的应用程序。它有几个字段,因此使用Page Down或Down键进入应用程序的底部需要相当长的时间。我只是想知道是否有任何按键操作可以直接将光标移到底部。 类似于此: class SimulationView(urwid.WidgetWrap): (line 6) { def get_main_frame(self): (line 127) buttons_box = urwid.Lis

各位晚上好,

我有一个使用Python Urwid库构建的应用程序。它有几个字段,因此使用Page Down或Down键进入应用程序的底部需要相当长的时间。我只是想知道是否有任何按键操作可以直接将光标移到底部。 类似于此:

class SimulationView(urwid.WidgetWrap):       (line 6)
{ 
def get_main_frame(self):                     (line 127)
buttons_box = urwid.ListBox(buttons_walker)   (line 148)
errors_box = urwid.ListBox(self.errors_content) (line 155)
sim_listbox = urwid.ListBox(self.sim_list_content)(line 158)

body = urwid.Pile([(6, buttons_box),('weight', 4, sim_listbox),
                       ('weight', 1, errors_box)])
frame = urwid.Frame(body, header=header)
     return frame


def keypress(self, size, key): 

   If key is "a": 
      # command to take the cursor to the bottom of the application
}

提前谢谢

对于默认窗口小部件,似乎没有任何等价的映射,哪怕只是因为每个应用程序可能对底部有不同的概念

你说的底部到底是什么意思?是否有一个始终存在的小部件,您希望为其提供焦点

具有可写焦点位置属性,可用于更改焦点,以下是一个示例:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import print_function, absolute_import, division
import urwid


def global_input(key):
    if key in ('q', 'Q', 'esc'):
        raise urwid.ExitMainLoop()
    elif key == 'page down':
        # "bottom" is last button, which is before footer
        pile.focus_position = len(pile.contents) - 2
    elif key == 'page up':
        # "top" is the first button, which is after footer
        pile.focus_position = 1
    elif key in ('1', '2', '3', '4'):
        pile.focus_position = int(key)


if __name__ == '__main__':
    footer = urwid.Text('Footer')
    pile = urwid.Pile([
        urwid.Padding(urwid.Text('Header'), 'center', width=('relative', 6)),
        urwid.Button('Button 1'),
        urwid.Button('Button 2'),
        urwid.Button('Button 3'),
        urwid.Button('Button 4'),
        urwid.Padding(footer, 'center', width=('relative', 20)),
    ])
    widget = urwid.Filler(pile, 'top')
    loop = urwid.MainLoop(widget, unhandled_input=global_input)
    loop.run()

谢谢你的精彩回答!。我指的底部类似于一本书的最后一页。在我的情况下,东西不是堆积如山的。有不同的容器小部件,因此我想将焦点从一个容器更改为另一个容器。如何做到这一点?嗯,听起来你需要一个了解布局的查找底部,它将为你找到容器和底部的位置。你能分享更多关于你当前代码的信息吗?在这一点上,似乎更多的是软件设计问题,而不是urwid你可以考虑感谢你的鼓励。很抱歉延迟回复。由于我是新手,我需要时间来尝试不同的东西并提出正确的问题。此时,问题不在于在不同的容器之间切换,因为只有一个容器太长,就像书中只有一页太长一样。在这个长容器中,不同的东西会像您的示例中那样堆积起来。问题是,urwid.MainLoop不在包含所有这些容器的类中。此外,我不能使用keypress函数,因为所有这些都在其他类中。我也看不到使用Super的可能性,因为所有这些东西都在从urwid继承的子类中。WidgetWrap@spectre不用担心,没什么好道歉的——这些事情需要时间!我没听懂你说的每一句话。你说的是关于一本书的一页-我想你正在开发一个读书应用程序?听起来非常有趣!您是否可以针对您遇到的每个特定问题提出一个新问题?例如,处理长页面,它到底导致了什么问题?该代码在语法上无效,它包含不属于那里的括号和行信息-您是否可以发布一个小版本,以我们可以运行的方式演示问题?问题是,我正在运行另外一个主代码中的350行代码,这个主代码也很长。很难发布运行的代码。我还有其他方法可以提供更多细节吗?最好的方法是创建一个新的单独的程序,只包含应用程序的最小结构,即所谓的主部件+示例。