sqr*_*ram 4 python pygtk textview gtk-textbuffer
我有一个TextView和一个TextBuffer与它相关联.
当用户按下Ctrl + b时,我希望文本开始以粗体键入,直到用户再次按Ctrl + b.
我正在尝试自己的方法,这些方法无效,然后我在邮件列表中找到了这篇文章:http: //www.daa.com.au/pipermail/pygtk/2009-April/016951.html
和我一样的问题,有人给出的解决方案
您的应用程序必须处理管理TextBuffer中标记所需的簿记.当文本插入光标时,您的应用程序必须捕获指示正在插入文本的信号,然后将所需的标记应用于插入的文本.我认为这可以通过捕获TextBuffer"insert-text"信号(使用connect_after()来确保文本已经插入)然后将标记应用于回调中的文本来完成.
所以我尝试了这个.这是我的textbuffer.py
import gtk
import pango
class TextBuffer(gtk.TextBuffer):
def __init__(self):
gtk.TextBuffer.__init__(self)
self.connect_after('insert-text', self.text_inserted)
# A list to hold our active tags
self.tags_on = []
# Our Bold tag.
self.tag_bold = self.create_tag("bold", weight=pango.WEIGHT_BOLD)
def get_iter_position(self):
return self.get_iter_at_mark(self.get_insert())
def make_bold(self, text):
''' add "bold" to our active tags list '''
self.tags_on.append('bold')
def text_inserted(self, buffer, iter, text, length):
# A text was inserted in the buffer. If there are ny tags in self.tags_on, apply them
if self.tags_on:
print self.get_iter_position()
# This sets the iter back N characters
iter.backward_chars(length)
# And this applies tag from iter to end of buffer
self.apply_tag_by_name('bold', self.get_iter_position(), self.get_end_iter())
print self.get_iter_position()
Run Code Online (Sandbox Code Playgroud)
只要有人按下Ctrl + b,就会从主脚本调用make_bold()方法.
从理论上讲,这正是邮件帮助所做的正是如此.但是没有用.我打字时文字没有显示为粗体.如果我按向左箭头并向后移动光标,然后键入一个字符,则光标右侧的字符将变为粗体.
我怎样才能完成这项任务?
此外,有人可以添加标签'textbuffer'吗?我无法创建新标签,我觉得该标签比'textview'更准确
在示例代码中,您可以调用iter.backward_charsin,TextBuffer.text_inserted
但是您从不使用iter!,因此我创建了一个示例脚本来显示所需的行为并澄清:
import gtk
import pango
class TextBuffer(gtk.TextBuffer):
def __init__(self):
gtk.TextBuffer.__init__(self)
self.connect_after('insert-text', self.text_inserted)
# A list to hold our active tags
self.tags_on = []
# Our Bold tag.
self.tag_bold = self.create_tag("bold", weight=pango.WEIGHT_BOLD)
def get_iter_position(self):
return self.get_iter_at_mark(self.get_insert())
def make_bold(self):
''' add "bold" to our active tags list '''
if 'bold' in self.tags_on:
del self.tags_on[self.tags_on.index('bold')]
else:
self.tags_on.append('bold')
def text_inserted(self, buffer, iter, text, length):
# A text was inserted in the buffer. If there are ny tags in self.tags_on, apply them
if self.tags_on:
# This sets the iter back N characters
iter.backward_chars(length)
# And this applies tag from iter to end of buffer
self.apply_tag_by_name('bold', self.get_iter_position(), iter)
def main():
window = gtk.Window()
window.connect('destroy', lambda _: gtk.main_quit())
window.resize(300, 300)
tb = TextBuffer()
tv = gtk.TextView(buffer=tb)
accel = gtk.AccelGroup()
accel.connect_group(gtk.keysyms.b,
gtk.gdk.CONTROL_MASK,gtk.ACCEL_LOCKED,
lambda a,b,c,d: tb.make_bold())
window.add_accel_group(accel)
window.add(tv)
window.show_all()
gtk.main()
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2171 次 |
| 最近记录: |