【问题标题】:How to make text fit inside a python curses textbox?如何使文本适合 python 诅咒文本框?
【发布时间】:2023-07-21 19:36:01
【问题描述】:

我尝试了很多方法试图使文本保持在其边界内,但我找不到方法。以下是我已经尝试过的。

#!/usr/bin/env python

import curses
import textwrap

screen = curses.initscr()
screen.immedok(True)

try:
    screen.border(0)

    box1 = curses.newwin(20, 40, 6, 50)
    box1.immedok(True)
    text = "I want all of this text to stay inside its box. Why does it keep going outside its borders?"
    box1.box()
    box1.addstr(1, 0, textwrap.fill(text, 39))

    #box1.addstr("Hello World of Curses!")

    screen.getch()

finally:
    curses.endwin()

【问题讨论】:

    标签: python ncurses curses


    【解决方案1】:

    您的第一个问题是调用box1.box() 会占用您盒子中的空间。它用完顶行、底行、第一列和最后一列。当您使用box1.addstr() 将字符串放入框中时,它从第 0 列第 0 行开始,因此会覆盖框字符。创建边框后,您的框每行只有 38 个可用字符。

    我不是诅咒专家,但解决此问题的一种方法是在 inside box1 中创建一个新框,该框一直插入一个字符。那就是:

    box2 = curses.newwin(18,38,7,51)
    

    然后您可以将文本写入该框中,而不会覆盖box1 中的框图字符。也不需要拨打textwrap.fill;似乎使用addstr 将字符串写入窗口会自动换行文本。事实上,调用textwrap.fill 可能会与窗口发生不良交互:如果文本换行正好在窗口宽度处换行,您最终可能会在输出中出现错误的空白行。

    给定以下代码:

    try:
        screen.border(0)
    
        box1 = curses.newwin(20, 40, 6, 50)
        box2 = curses.newwin(18,38,7,51)
        box1.immedok(True)
        box2.immedok(True)
        text = "I want all of this text to stay inside its box. Why does it keep going outside its borders?"
        text = "The quick brown fox jumped over the lazy dog."
        text = "A long time ago, in a galaxy far, far away, there lived a young man named Luke Skywalker."
        box1.box()
        box2.addstr(1, 0, textwrap.fill(text, 38))
    
        #box1.addstr("Hello World of Curses!")
    
        screen.getch()
    
    finally:
        curses.endwin()
    

    我的输出如下所示:

    【讨论】:

    • 请注意,Thomas Dickey 和我发布了基本相同的答案,尽管他使用.derwin 创建一个子窗口,这可能是更好的方法。我的有图片。掷硬币:)
    【解决方案2】:

    窗口的一部分,使用与文本相同的区域。在第一个窗口上绘制一个框后,您可以制作第一个窗口的子窗口。然后在子窗口中编写您的包装文本。

    类似

    box1 = curses.newwin(20, 40, 6, 50)
    box1.immedok(True)
    text = "I want all of this text to stay inside its box. Why does it keep going outside its borders?"
    box1.box()
    box1.refresh()
    # derwin is relative to the parent window:
    box2 = box1.derwin(18, 38, 1,1)
    box2.addstr(1, 0, textwrap.fill(text, 39))
    

    参见参考资料中derwin的描述。

    【讨论】: