是否可以在同一位置打印 'for loop' 的 table 而无需使用 python 向前移动终端线?
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?
这里是一个代码示例,用于在控制台的相同光标位置打印一些数字,而不移动字符。
代码示例
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
问题
Does this same approach work if we need to print an entire table over and over at the same position, without creating a new table line, making it altogether static
.
我的目标是让底部给出的代码正常工作,与上面分享的 code example
相同。
在控制台上打印 table 时,table 的 headers 不得更改,但传递的值(行元素)必须在相同的单元格位置动态更改,迭代传递的值。
下面是我的目标代码。
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')
每次都会将 table 打印到新行上。
我希望看到 table 在第一次迭代(for 循环)中打印出来,完全被下一次迭代的 table 取代,依此类推。
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
输出
这里是一个代码示例,用于在控制台的相同光标位置打印一些数字,而不移动字符。
代码示例
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
问题
Does this same approach work if we need to print an entire table over and over at the same position, without creating a new table line, making it altogether
static
.
我的目标是让底部给出的代码正常工作,与上面分享的 code example
相同。
在控制台上打印 table 时,table 的 headers 不得更改,但传递的值(行元素)必须在相同的单元格位置动态更改,迭代传递的值。
下面是我的目标代码。
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')
每次都会将 table 打印到新行上。
我希望看到 table 在第一次迭代(for 循环)中打印出来,完全被下一次迭代的 table 取代,依此类推。
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
输出