2017-09-20 8 views
2

私のカーソル(line.column)がどこにあるのかというアイデアがラベルに表示されていました。 .index(INSERT)でうまく動作しますが、テキストで右マウスボタンをバインドすると、現在のカーソル位置ではなく前のカーソル位置が返されます。 イベント後にコールバックが実行されたようですか?Python Tkinterバインディングを正しく使うには?

from tkinter import Tk, Text, Frame, Label, StringVar, constants, END, INSERT 

EXPL_TEXT = "I know that dress is karma. Perfume regret\nYou got me thinking bout" 

class App(Frame): 
    def __init__(self,master): 
     Frame.__init__(self,master) 
     self.pack() 
     self.var = StringVar() 
     self.init_widgets() 

    def init_widgets(self): 
     self.text = Text(self) 
     self.text.bind('<Button-1>',self.callback_index) 
     self.text.pack() 
     self.text.insert(END,EXPL_TEXT) 
     self.label = Label(self, textvariable=self.var) 
     self.label.pack() 

    def callback_index(self,event): 
     x = self.text.index(INSERT) 
     self.var.set(x) 

if __name__ == '__main__': 
    root = Tk() 
    app = App(root) 
    root.mainloop() 

答えて

0

私はあなたが見ていると信じ問題は、INSERTを読み取るためにイベントが発生するダウンマウスをクリックしたときにということです。問題は、マウスを持ち上げる前に、その位置には以前のINSERTの値が残っていることです。したがって、イベントが完了した後に更新を取得するには、after()を使用してイベントが終了するまで待ってから、self.varの値を設定します。

はあなたに callback_index方法を変更

def callback_index(self,event): 
    root.after(0, lambda: self.var.set(self.text.index(INSERT))) 

我々が設定した時間後に起こるために何かをスケジュールするためのpythonを語っている行っています。私は(私が間違っている場合私を訂正してください)と考えています。イベントが進行中であるため、そのイベントが終了してafter()メソッドでアクションを実行するまで待機します。

lambdaを使用して、self.var変数を更新するための匿名関数を作成し、すべてが意図した通りに動作するようにします。

+0

シエラありがとうございましたあなたは絶対的に正しいです –

+0

それはいくつかのイベントで発生します。リストボックスでも目立ちます。 'after()'で回避するだけです。他の解決策もあるかもしれませんが、これは私のために働いています。 –

関連する問題