3

私は gtk.TextView() を持っており、ユーザーがテキストを入力してリターンを押すたびに、ターミナルにテキストを出力し、テキスト領域のすべてを消去したいので、テキストビューの先頭にカーソルを置きます。私がしようとしました :

self.textbuffer.set_text("")

また :

start, end = self.textbuffer.get_bounds()
self.textbuffer.delete(start, end)

ただし、これらのコードは両方とも、テキスト領域のテキストを消去しても、カーソルを最初の行に戻すのではなく、2 行目に戻します。さらにテキストを入力して戻ると、常に 2 行目にとどまります。その理由はわかりません。

まあ、私はそれを行うことができなかったので、当分の間トリックを使用しました。

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 に再度追加します。機能しますが、本当に汚れています...

その汚いコードなしでこれを機能させる方法について何か考えはありますか?

前もって感謝します、

ノリアン

4

1 に答える 1

3

何が起こっているかは次のとおりです。

ユーザーが Enter キーを押すと、コードが実行されます。その後、ウィジェットが再び引き継ぎ、Returnが押されたときに常に行うこと、つまりカーソルを次の行に移動します。

しかし、コマンドをキーリリースイベントにバインドすると、

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

次に、カーソルが次の行に移動したにコードが実行されるためset_text("")、バッファをクリアしてカーソルをその先頭に移動するために必要なすべてです。

于 2011-08-27T16:06:18.500 に答える