python-prompt-toolkit:使容器可滚动

问题描述

我正在尝试使用 ScrollablePane 使容器可滚动。但我无法使用鼠标或键盘滚动

from prompt_toolkit.layout.controls import FormattedTextControl
from prompt_toolkit import Application
from prompt_toolkit.layout import ScrollablePane
from prompt_toolkit.layout.layout import Layout
from prompt_toolkit.layout.containers import HSplit,VSplit,Window

content = HSplit(
  [
    VSplit(
      [Window(FormattedTextControl('First Column')),Window(FormattedTextControl('Second Column'))
      ]),VSplit(
      [Window(FormattedTextControl('First Column')),])
container = ScrollablePane(content=content)

app = Application(layout=Layout(container),full_screen=True)
app.run()

解决方法

首先,您应该在 mouse_support 中启用 app

app = Application(mouse_support=True,...)

这实际上似乎并没有使 ScrollablePane 可以使用鼠标滚轮或使用箭头滚动。我还没有找到解决方案。

我发现在 Window 内堆叠一堆可聚焦元素(例如 ScrollablePane)并分配键盘快捷键以将应用焦点从一个元素更改为下一个元素会滚动窗格。

示例(降低窗口高度或增加 number 以遮挡部分显示):

from prompt_toolkit import Application
from prompt_toolkit.application import get_app
from prompt_toolkit.key_binding import KeyBindings
from prompt_toolkit.layout import HSplit,FormattedTextControl,Window,ScrollablePane,Layout

kb = KeyBindings()

number = 30

inner = HSplit(children=[Window(FormattedTextControl(text=f"Button {x}")) for x in range(number)])

index = 0


def increment_index():
    global index
    if index == number - 1:
        index = 0
    else:
        index += 1


@kb.add('n')
def _(event):
    increment_index()
    get_app().layout.focus(inner.children[index])


@kb.add('q')
def _(event):
    get_app().exit()


outer = ScrollablePane(content=inner)

app = Application(mouse_support=True,layout=Layout(outer),full_screen=True,key_bindings=kb)

app.run()