2017-09-20 248 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()'解決它。也可以有其他的解決方案,但這對我來說很有效。 –