如何在Python Rich的Layout中嵌入表格并解决ANSI代码异常问题
问题:Rich库表格放入Layout后显示ANSI代码且颜色失效
尝试用Python的Rich库将表格放入Layout布局框时,输出出现大量类似ANSI代码的字符,列设置的颜色属性也未生效。直接打印表格显示正常,但放入Layout占位符后就异常。
原代码
from re import X import psycopg2 from rich.console import Console from rich.table import Table from rich import box from rich.layout import Layout from rich import print as rprint layout = Layout() layout.split_column( Layout(name="upper"), Layout(name="lower") ) connection = psycopg2.connect(user="enterprisedb", password="xxxx", host="xx.xx.xxx.170", port="5444", database="edb") cursor = connection.cursor() def imp_file_layout(): table1 = Table(title="FILE LOCATIONS") table1.add_column("FILE_NAME", style="cyan", no_wrap=True) table1.add_column("LOCATION", style="magenta") directory_detail_Query = "select name,setting from pg_settings where name in ('data_directory','config_file','hba_file');" cursor.execute(directory_detail_Query) directory_records = cursor.fetchall() for row in directory_records: table1.add_row(*list(row)) console=Console(markup=False) with console.capture() as capture: console.print(table1) return capture.get() x=imp_file_layout(); layout["lower"].update(x) rprint(layout) cursor.close() connection.close()
异常输出
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ [3m FILE LOCATIONS [0m ┏━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃[1m [0m[1mFILE_NAME [0m[1m [0m┃[1m [0m[1mLOCATION [0m[1m [0m┃ ┡━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩ │[36m [0m[36mconfig_file [0m[36m [0m│[35m [0m[35m/var/lib/edb/as14/data/postgresql.conf[0m[35m [0m│ │[36m [0m[36mdata_directory[0m[36m [0m│[35m [0m[35m/var/lib/edb/as14/data [0m[35m [0m│ │[36m [0m[36mhba_file [0m[36m [0m│[35m [0m[35m/var/lib/edb/as14/data/pg_hba.conf [0m[35m [0m│ └────────────────┴────────────────────────────────────────┘
解决方法
问题根源在于你用console.capture()把表格转换成了带ANSI转义的字符串,而Layout可以直接接收Rich的可渲染对象(比如Table实例),不需要转成字符串。另外markup=False也会干扰样式渲染。
修改步骤:
- 删除
console.capture()相关的代码,直接返回Table对象 - 移除多余的
console=Console(markup=False)行
修改后的代码:
from re import X import psycopg2 from rich.table import Table from rich.layout import Layout from rich import print as rprint layout = Layout() layout.split_column( Layout(name="upper"), Layout(name="lower") ) connection = psycopg2.connect(user="enterprisedb", password="xxxx", host="xx.xx.xxx.170", port="5444", database="edb") cursor = connection.cursor() def imp_file_layout(): table1 = Table(title="FILE LOCATIONS") table1.add_column("FILE_NAME", style="cyan", no_wrap=True) table1.add_column("LOCATION", style="magenta") directory_detail_Query = "select name,setting from pg_settings where name in ('data_directory','config_file','hba_file');" cursor.execute(directory_detail_Query) directory_records = cursor.fetchall() for row in directory_records: table1.add_row(*list(row)) # 直接返回表格对象,无需捕获字符串 return table1 x=imp_file_layout(); layout["lower"].update(x) rprint(layout) cursor.close() connection.close()
这样修改后,Layout会正确渲染表格的样式,不会再显示ANSI代码,列的颜色也能正常生效。
内容的提问来源于stack exchange,提问作者rajkishore patro
相关产品推荐
相关产品推荐

