如何在 Asciimatics 下检测屏幕大小调整

How to detect screen resize under Asciimatics

这个小片段会在屏幕右下角显示 h x w

from asciimatics.screen import Screen
import time

def print_dims(screen):
    (h, w) = screen.dimensions
    screen.print_at("%3d x %3d" % (h, w), w - 12, h - 1, Screen.COLOUR_BLUE, Screen.A_NORMAL)

def demo(screen):
    print_dims(screen)
    while True:
        if screen.has_resized():   # never triggered
            print_dims(screen)
        ev = screen.get_key()
        if ev in (ord('Q'), ord('q')):
            return
        time.sleep(0.1)
        screen.refresh()

Screen.wrapper(demo)

情况

第一次调用 print_dims() 工作正常。

当我调整 window 大小时,屏幕上的所有内容都被清空了。循环内的 screen.has_resized() 永远不会被触发。但是程序仍然是 运行ning 因为 'Q' 会正确退出。

Python 在 Linux VM 上 运行ning,我正在使用 MacOS (TERM="xterm-256color") 中的 ssh/iTerm2 访问 Linux虚拟机。

请求协助

此时,我需要进行完整性检查。

我不知道我的代码、我的终端程序是否有问题,或者 curses 是否没有使用调整大小信号编译。 MacOS 上的 iTerm2 可能没问题,因为当我在另一个 window 中 运行 vim 并调整 iTerm2 window 的大小时,vim 确实识别了调整大小。

有没有人让他们的系统在 asciimatics 中检测到 screen.has_resize()?如果是这样,请分享您的代码片段并分享您的环境,以便我可以准确缩小我做错的范围。

谢谢。

这是一个微妙的问题...屏幕将保持其尺寸,直到您重新创建它。您的代码正在被触发,但将相同的内容打印到双缓冲区,因此不会在刷新时更新。

您只需允许调整屏幕对象的大小。例如...

from asciimatics.screen import Screen
import time
import sys

def print_dims(screen):
    (h, w) = screen.dimensions
    screen.print_at("%3d x %3d" % (h, w), w - 12, h - 1, Screen.COLOUR_BLUE, Screen.A_NORMAL)

def demo(screen):
    print_dims(screen)
    while True:
        if screen.has_resized():
            return
        print_dims(screen)
        ev = screen.get_key()
        if ev in (ord('Q'), ord('q')):
            sys.exit(0)
        time.sleep(0.1)
        screen.refresh()

def main():
    while True:
        Screen.wrapper(demo)

main()