是否可以在不使用 python 移动终端行的情况下在同一位置打印“for循环”表?

Posted

技术标签:

【中文标题】是否可以在不使用 python 移动终端行的情况下在同一位置打印“for循环”表?【英文标题】:Is it possible to print a table of a 'for loop' at the same position without moving ahead the lines of the Terminal using python? 【发布时间】:2021-01-22 01:50:33 【问题描述】:

这是一个代码示例,用于在控制台的相同光标位置打印一些数字,而不需要移动字符。

代码示例

from sys import stdout
from time import sleep
for i in range(1,20):
    stdout.write("\r%d" % i)
    stdout.flush()
    sleep(1)
stdout.write("\n") # move the cursor to the next line

问题

如果我们需要在同一位置一遍又一遍地打印整个表格,而不创建新的表格行,那么这种方法是否有效,完全是static


我的目标是使底部给出的代码能够正常工作,与上面共享的code example 相同。

在控制台上打印表格时,表格的标题不得更改,但传递的值(行元素)必须在相同的单元格位置动态更改,迭代传递的值。

下面是我的目标代码。

from prettytable import PrettyTable
from sys import stdout
from time import sleep

t = PrettyTable(['Name', 'Age'])
lis = [['Alice', 25],['Alice', 20],['Man', 20]]
for x in lis:
    t.add_row(x)
    print(t, end='\r')
    t.clear_rows()
    sleep(1)
stdout.write("\n")

在这里,迭代print(t, end='\r') 每次都将表格打印到新行上。

我希望看到为第一次迭代(for 循环)打印的表格,完全被下一次迭代的表格替换,依此类推。

【问题讨论】:

这里没有curses;您只是将光标返回到带有\r 的行的开头。如果你想回到上一行的位置,你需要curses(或其他形式的光标寻址)。 @triplee 正如您所说,我使用curses 找到了一个很好的解决方案,但问题现在已经结束。当问题重新打开时,我会尽快发布答案。 我不确定这是否仍然足够清楚可以重新打开,即使那样我想它最终可能会作为现有问题的副本再次被关闭。没有做你想做的事情的代码是传达你想做的事情的糟糕方式。 好的。我接受。只是更好地编辑了这个问题。我之前创建的重复问题已经关闭。 【参考方案1】:

curseXcel 和 curses 可以做到这一点。请检查 curseXcel 可用的所有不同方法。

先决条件

安装

sudo pip install curseXcel


代码

import curses
from curseXcel import Table
from time import sleep
def main(stdscr):
    y = 0
    table = Table(stdscr, 2, 4 ,10, 45, 20, spacing=2, col_names=True) # This sets the table rows, columns, width, height and spacing.
    for x in [['Name',0], ['Age',1], ['Job',2],['Country', 3]]:
     # This sets the header columns.
        table.set_column_header(x[0],x[1])
    table.delete_row(1) # This deletes the additional row.
    nameList = [["Alice", 25, 'Painter', 'AUS'],["Bob", 32, 'cop', 'UK'],["Thinker", 20, 'coder', 'UK'],["Adam", 70, 'None', 'USA'],["Jessi", 14, 'None', 'BZA'],["Leo", 30, 'Army', 'India']]
# This above list contains data you need to loop through
    while (y != 'q'): # This makes the loop to repeat indefinitely.
        #y=  stdscr.getkey()
        for x in nameList:
            sleep(1)
            # This sets the elements of the list to the respective positions.
            table.set_cell(0,0, x[0])
            table.set_cell(0,1, x[1])
            table.set_cell(0,2, x[2])
            table.set_cell(0,3, x[3])
            table.refresh()

stdscr = curses.initscr()
curses.noecho()
curses.cbreak()
stdscr.keypad(True)

curses.wrapper(main)

curses.nocbreak()
stdscr.keypad(False)
curses.echo()
curses.endwin() # End curses

输出

【讨论】:

以上是关于是否可以在不使用 python 移动终端行的情况下在同一位置打印“for循环”表?的主要内容,如果未能解决你的问题,请参考以下文章

在不终止用户的情况下更新终端服务的24/7应用程序

如何在不使用终端的情况下退出 omxplayer?

如何在不从终端或任何编辑器执行的情况下运行 python 程序 [重复]

是否可以从一个字符串本地保存数据,然后在不将其移动到其他地方的情况下进行破坏?

是否可以在不使用 GUI 的情况下使用 ParaView Python Shell 加载 OpenFOAM 解决方案文件?

如何在不裁剪或换行的情况下限制列宽?