Python 颜色在乌尔维德或诅咒中传递

Python 颜色在乌尔维德或诅咒中传递,python,curses,urwid,Python,Curses,Urwid,我想围绕git日志编写一个包装器,它有点类似于gitk,但在终端上 我认为这应该很容易,因为git log已经格式化了输出,我所需要做的就是把它放在一个列表视图中,在那里我可以选择提交 然而,urwid和curses都会弄乱git log使用的颜色代码。 我试图实现一个定制的urwid小部件,希望它可以不使用颜色代码,但它的行为没有任何不同 我考虑将输出的颜色从git日志移到我的包装器中,但使用-graph选项是不可能的 颜色的直接传递与正常的打印语句一起工作,但我不想重新发明窗口管理、输入处理

我想围绕git日志编写一个包装器,它有点类似于gitk,但在终端上

我认为这应该很容易,因为git log已经格式化了输出,我所需要做的就是把它放在一个列表视图中,在那里我可以选择提交

然而,urwid和curses都会弄乱git log使用的颜色代码。 我试图实现一个定制的urwid小部件,希望它可以不使用颜色代码,但它的行为没有任何不同

我考虑将输出的颜色从git日志移到我的包装器中,但使用-graph选项是不可能的

颜色的直接传递与正常的打印语句一起工作,但我不想重新发明窗口管理、输入处理、识别大小调整,我不知道还有什么

我怎样才能阻止乌尔维德或诅咒者触摸颜色代码

期望输出:

取得的产出:

MWE:

model.py:

!/usr/bin/env python 导入子流程 类日志模型: 编码=utf-8 cmd=[git,log,-color,-graph,-pretty=格式:%Cred%h%Creset-%Cyellow%d%Creset%s%Cgreen%cr%Cbold blue%Creset,-abbrev commit] def获取线路自身: p=subprocess.runself.cmd,stdout=subprocess.PIPE,check=True,encoding=self.encoding out=p.stdout 返回。拆分行 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': 对数=对数模型 对于log.get_行中的ln: 普林顿 git日志格式的优点在于

main_urwid.py:

!/usr/bin/env python 导入urwid 导入模型 类myTextureWid.Widget: _尺寸=冻结集['flow'] 定义初始自我,文本: 超级__ self.text=text.encodeutf-8 def renderself,size,focus=False: maxcol,=大小 返回urwid.TextCanvas[self.text],maxcol=maxcol,检查\u width=False def rowsself,size,focus=False: 返回1 类LogViewurwid.ListBox: 定义初始自我,日志模型: widgets=[self.create\u line\u widgetln for ln in log\u model.get\u line] body=urwid.SimpleFocusListWalkerwidgets 超级。初始体 def create_line_widgetself,ln: 返回urwid.Textln,wrap=urwid.CLIP 返回MyTextln 类应用程序: 调色板=[] 定义初始自我: self.view=LogViewmodel.LogModel def runself: self.loop=urwid.MainLoopself.view,self.palete, 未处理的\u输入=自我。未处理的\u输入 self.loop.run def未处理_输入自身,k: 如果k==q: raise urwid.ExitMainLoop 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': a=应用程序 a、 跑 main_curses.py:

!/usr/bin/env python 进口诅咒 导入模型 def DSCR: log_model=model.LogModel 诅咒。使用默认颜色 stdscr.clear col=0 对于enumeratelog\u model.get\u行中的行ln: stdscr.addstrow,col,ln 刷新 stdscr.getkey 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': 诅咒
对于ncurses,将$TERM设置为vt100 no color,但git的日志可能仍然会发送颜色转义,而您的curses示例不会过滤这些颜色转义。@ThomasDickey谢谢您的回复。不幸的是,这没有帮助。在运行我的程序之前,我设置了export TERM=vt100,并注释掉了curses.use_default_colors,这会导致错误,但输出仍然相同。git仍然输出所需的颜色代码,curses仍然将它们打印为文本,而不是我想要更改的颜色。对于诅咒,这是重复的,例如,@ThomasDickey谢谢你给我指出这些答案。我需要更多的时间来研究它,但我认为这回答了我的问题。