سؤال

أحاول استخدام المحطة من بيثون VTE الربط (Python-Vte من Debian Squeeze) كمحاكي طرفي افتراضي (فقط لمعالجة نص 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 vte_wiredness_1.py 
''

من الغريب أن لصق الكود مرة أخرى في جلسة بيثون التفاعلية (الجديدة) يؤدي أيضًا إلى سلسلة فارغة:

>>> import vte
>>> term = vte.Terminal()
>>> term.feed("a\nb")
>>> print repr(term.get_text(lambda *a: True).rstrip())
''
>>>

كان أول شيء في ذهني هو أن الفرق الوحيد بين الحالتين هو التوقيت - يجب أن يكون هناك بعض التأخير من قبل get_text. لسوء الحظ ، مقدمة get_text مع بعض الثواني لم يساعد النوم

ثم اعتقدت أنه له علاقة ببيئة نافذة X. لكن النتائج هي نفس وحدة Linux Pure (مع بعض التحذيرات من الرسومات المفقودة).

أتساءل ما الذي يسبب مثل هذا السلوك غير المتوقع (وحدة تحكم تفاعلية - تم لصقها مقابل مكتوبة ، وهي ليست التأخير .. Ant the Interactive Console لا علاقة لها بالكائن الطرفي VTE .. أعتقد)

هل يمكن لأحد أن يشرح ما يحدث؟ هل من الممكن استخدام مصطلح VTE مثل هذا الطريق؟

أن الحرف "B" في الإخراج مسبقه من قبل المساحة ، هو غرابة أخرى (تسبق جميع الخطوط المتتالية المزيد من المساحات .. يبدو أنني يجب أن أرسل عودة النقل قبل السلسلة.)

(ال lambda *a: True الحصول على النص وسيطة الطريقة التي أستخدمها هي رد اتصال وهمية ، إنه بعض SlotselectedCallback.. لتفسيره سأكون ممتنًا أيضًا :))

هل كانت مفيدة؟

المحلول

.. تمييز نفسي الحل الذي وجدته في مكان آخر

كانت المشكلة هي أنني كنت أتجاهل حقيقة أن Vte.Terminal هو تطبيق 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()

شكرا Juhaz@irc: //freenode.net/##gnome

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top