题
我正在尝试使用Python的终端 VTE 绑定(来自Debian Squeeze的Python-VTE)作为虚拟终端模拟器(仅适用于ANSI/Control Chars文本处理)
在交互式python控制台中,一切看起来(几乎)都很好:
>>> import vte
>>> term = vte.Terminal()
>>> term.feed("a\nb")
>>> print repr(term.get_text(lambda *a: True).rstrip())
'a\n b'
但是,启动此代码(很少修改)作为Python脚本,产生了不同的结果:
$ python vte_wiredness_1.py
''
奇怪的是,将代码粘贴回(新的)交互式python会话也产生空字符串:
>>> import vte
>>> term = vte.Terminal()
>>> term.feed("a\nb")
>>> print repr(term.get_text(lambda *a: True).rstrip())
''
>>>
我想到的第一件事是,两种情况之间的唯一区别是时机 - 之前必须有一些延迟 get_text
. 。不幸的是,序幕 get_text
有几秒钟的睡眠没有帮助
然后我认为这与X窗口环境有关。但是结果是相同的纯Linux控制台(关于缺少图形的警告)。
我想知道是什么导致这种不可预测的行为(交互式控制台 - 粘贴VS键入,这不是延迟。.ant交互式控制台与VTE终端对象无关。我猜)
有人可以解释发生了什么吗?是否可以这样使用VTE术语?
输出中的“ B”字母在空间之前,是另一个陌生度(所有连续的线都有更多的空间。看起来我必须在字符串之前发送托架返回。)
(这 lambda *a: True
get_text 我正在使用的方法参数是虚拟回调,这是一些 slotselectedCallback..对于它的解释,我也要感激:))
解决方案
..让自己安置我在其他地方找到的解决方案
问题是我忽略了VTE.端子是GTK小程序的事实,因此必须称呼GTK主循环。
import gtk
import vte
term = vte.Terminal()
term.feed("a\r\nb")
def get_text(term):
print repr(term.get_text(lambda *a: True).rstrip())
gtk.main_quit()
term.connect('contents-changed', get_text)
gtk.main()
谢谢
不隶属于 StackOverflow