Pygtk TextView 光标设置在开头
我有一个gtk.TextView(),每次用户在里面输入文本并按下回车键时,我想在终端打印出这些文本,然后清空文本区域,并把光标放回文本框的开头。我尝试了:
self.textbuffer.set_text("")
或者:
start, end = self.textbuffer.get_bounds()
self.textbuffer.delete(start, end)
但是这两段代码虽然能清空文本区域,却没有把光标放回第一行,而是停在了第二行。如果我再输入更多文本并按回车,光标总是停在第二行,我不知道为什么会这样。
我没能解决这个问题,所以暂时用了一个小技巧,代码如下:
self.textview = gtk.TextView()
self.textbuffer = self.textview.get_buffer()
self.textview.connect("key_press_event", self.on_key_press_event)
还有我的self.on_key_press_event:
def on_key_press_event(self,widget, event):
keyname = gtk.gdk.keyval_name(event.keyval)
if keyname == "Return":
self.textbuffer = self.textview.get_buffer()
startiter, enditer = self.textbuffer.get_bounds()
print self.textbuffer.get_text(startiter, enditer)
self.textview.destroy()
self.textview=gtk.TextView()
self.sw.add(self.textview)
self.textview.show()
self.textview.grab_focus()
self.textview.connect("key_press_event", self.on_key_press_event)
所以每次用户按下回车时,我就把文本框从gtk.ScrolledWindow中移除,销毁它,然后再创建一个新的文本框并重新添加到gtk.ScrolledWindow中,这样虽然能实现功能,但感觉真的很不优雅……
有没有什么办法可以让这个功能正常工作,而不需要这么麻烦的代码呢?
提前谢谢你,
Nolhian
1 个回答
3
事情是这样的:
当用户按下回车键时,你的代码就会被执行。然后,程序会再次接管,按照它的惯例处理回车键的操作,也就是把光标移动到下一行。
但是,如果你把你的命令绑定到键盘的 释放 事件上,
self.textview.connect("key_release_event", self.on_key_press_event)
那么你的代码会在光标移动到下一行之后执行,这样只需要用 set_text("")
就能清空缓冲区,并把光标移动到起始位置。