替换终端中的多行字符串

时间:2017-06-09 21:21:08

标签: python-3.x

我正在尝试编写一些会覆盖其先前输出的代码,例如原始输出为“1”,但“1”替换为“2”。这使得看起来好像从未输出过“1”。 我有一个名为“Board”的列表,我使用此代码将此列表转换为多行字符串:

PrintBoard = """"""
for y in range(Board_Height):
    for x in range(Board_Length):
        PrintBoard += Board[y][x]

    PrintBoard += "\n"

我得到了我想要的字符串。但是,我希望能够使用新字符串更新此字符串并将其替换为旧字符串。

示例输出:

+-------+                      +-------+
|       |  *gets replaced by*  |       |
|       | -------------------> |   *   |
|       |                      |       |
+-------+                      +-------+

目前我一直尝试使用end="\r"来做到这一点 例如

print(PrintBoard, end="\r")
UpdateBoard
print(PrintBoard, end="\r")

这导致了这个输出:

+-------+
|       |
|       |
|       |
+-------+
+-------+
|       |
|   *   |
|       |
+-------+

4 个答案:

答案 0 :(得分:0)

我建议您使用类似

的内容
print(PrintBoard, end='')
for x in len(PrintBoard):
    print("\b")
UpdateBoard()
print(PrintBoard, end='')

此解决方案使用ASCII退格符转义字符\ b。另外,我没有看到使用end="\r"的重点,所以我将其替换为end=""

答案 1 :(得分:0)

我会将每个棋盘分成它自己的列表,如下所示:

l_nMinplacesPos.push_back(m_nCurrentTime);

然后打印你可以把它们拉在一起打印..

a = ["+-------+", 
     "|       |",
     "|       |",
     "|       |",
     "+-------+"]

b = ["+-------+",
     "|       |",
     "|   *   |",
     "|       |",
     "+-------+"]

div = ["            ",
       "  rep with  ",
       " -------->  ",
       "            ",
       "            "]

答案 2 :(得分:0)

这并不像你想象的那么微不足道。您可以使用\r(回车)返回到当前行,或\b将字符移回 - 这些都让人联想到早期的电子打字机时代 - 但要绕过屏幕,您需要更多控制终端。当然,您可以在Windows上的* nix / os.system('clear')上调用os.system('cls')来清除整个屏幕并再次绘制它,但这并不优雅。

相反,Python提供了专为此目的而设计的curses模块。这是一个关于如何使用它的简单演示:

import curses
import time

console = curses.initscr()  # initialize is our playground

# this can be more streamlined but it's enough for demonstration purposes...
def draw_board(width, height, charset="+-| "):
    h_line = charset[0] + charset[1] * (width - 2) + charset[0]
    v_line = charset[2] + charset[3] * (width - 2) + charset[2]
    console.clear()
    console.addstr(0, 0, h_line)
    for line in range(1, height):
        console.addstr(line, 0, v_line)
    console.addstr(height-1, 0, h_line)
    console.refresh()

def draw_star(x, y, char="*"):
    console.addstr(x, y, char)
    console.refresh()

draw_board(10, 10)  # draw a board
time.sleep(1)  # wait a second
draw_star(6, 6)  # draw our star
time.sleep(1)  # wait a second
draw_star(6, 6, " ")  # clear the star
draw_star(3, 3)  # place the star on another position
time.sleep(3)  # wait a few seconds

curses.endwin()  # return control back to the console

当然,你可以得到比这更好的,但它应该给你如何利用它的想法。

答案 3 :(得分:0)

您尚未指定是否需要在Linux或Windows上运行解决方案。

对于Linux,您可以使用zwer回答。但是, curses 模块在Windows上不可用。

Windows cmd 非常简单,无法理解高级格式。 您已清除并重绘整个窗口以获取动画。

这是一个星球随机移动20帧动画的例子:

import os
import time
import random
import copy


board = [['+', '-', '-', '-', '-', '-', '-', '-', '-', '+'],
 ['|', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '|'],
 ['|', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '|'],
 ['|', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '|'],
 ['|', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '|'],
 ['|', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '|'],
 ['|', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '|'],
 ['|', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '|'],
 ['|', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '|'],
 ['+', '-', '-', '-', '-', '-', '-', '-', '-', '+']]


for i in range(20):
    os.system('cls')
    frame = copy.deepcopy(board)
    frame[random.randint(1, 8)][random.randint(1, 8)] = '*'
    print('\n'.join([''.join(i) for i in frame]))
    time.sleep(1)