2017-09-20 255 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()'解决它。也可以有其他的解决方案,但这对我来说很有效。 –