首页 > 解决方案 > 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')),
      Window(FormattedTextControl('Second Column'))
      ]),
    VSplit(
      [Window(FormattedTextControl('First Column')),
      Window(FormattedTextControl('Second Column'))
      ]),
  ])
container = ScrollablePane(content=content)

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

标签: pythonterminalprompt-toolkitptpython

解决方案


mouse_support首先,您应该启用app

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

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

我发现在其中堆叠一堆可聚焦元素(例如WindowScrollablePane并分配键盘快捷键以将应用程序焦点从一个元素更改为下一个元素将滚动窗格。

示例(降低窗口高度或增加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()

推荐阅读