Pygtk TextView устанавливает курсор в начале - PullRequest
3 голосов
/ 26 августа 2011

У меня есть gtk.TextView (), и каждый раз, когда пользователь помещает в него текст и нажимает клавишу возврата, я хочу напечатать текст в терминале и стереть все в текстовой области и, таким образом, поместить курсор в начало 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)

Таким образом, каждый раз, когда пользователь нажимает return, я удаляю текстовое представление из моего gtk.ScrolledWindow, уничтожаю его, создаю новое и снова добавляю его в свой gtk.ScrolledWindow, оно работает, но оно действительно грязное ...

Есть идеи, как я могу заставить это работать без этого грязного кода?

Заранее спасибо,

Nolhian

1 Ответ

3 голосов
/ 27 августа 2011

Вот что происходит:

Пользователь нажимает клавишу ввода, и ваш код запускается.Затем виджет снова вступает во владение и делает то, что он всегда делает, когда нажимается Return, что означает перемещение курсора на следующую строку.

Но если вы связываете свою команду с клавишей release событие,

self.textview.connect("key_release_event", self.on_key_press_event)

затем ваш код выполняется после курсор был перемещен на следующую строку, поэтому set_text("") - это все, что необходимо для очистки буфера и перемещениякурсор в его начало.

...