如何使文本适合python curses文本框内?

如何使文本适合python curses文本框内?

问题描述:

我尝试了很多事情,试图让文本留在它的边界内,但我找不到方法。以下是我已经尝试过的。如何使文本适合python curses文本框内?

#!/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() 

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

我不是一个诅咒专家,但是解决这个的一种方式是创建内部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() 

我的输出是这样的:

enter image description here

+0

需要注意的是托马斯·迪基和我已经基本张贴了同样的答案,虽然他使用'.derwin'创建一个子窗口,这可能是更好的方法。我有图片。抛硬币 :) – larsks

窗口的一部分,并使用相同的房地产为文本。在第一个窗口上绘制一个框后,您可以创建第一个窗口的子窗口。然后在子窗口中编写包装文本。

喜欢的东西

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描述。