Python Tkinter如何正确使用绑定?

Python Tkinter如何正确使用绑定?,python,tkinter,Python,Tkinter,这个想法显示在我的光标(line.column)所在的标签中。这对.index(INSERT)很有效,但是如果我用文本绑定鼠标右键,它将返回上一个光标位置,而不是当前位置。 似乎回调是在事件之后执行的 from tkinter import Tk, Text, Frame, Label, StringVar, constants, END, INSERT EXPL_TEXT = "I know that dress is karma. Perfume regret\nYou got me th

这个想法显示在我的光标(line.column)所在的标签中。这对.index(INSERT)很有效,但是如果我用文本绑定鼠标右键,它将返回上一个光标位置,而不是当前位置。 似乎回调是在事件之后执行的

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()
从tkinter导入Tk、文本、框架、标签、StringVar、常量、结束、插入
EXPL\u TEXT=“我知道那件衣服是因果报应。香水后悔\n你让我想起了”
类应用程序(框架):
定义初始(自我,主):
帧。\uuuu初始化(自,主)
self.pack()
self.var=StringVar()
self.init_widgets()
def init_小部件(自):
self.text=文本(self)
self.text.bind(“”,self.callback\u索引)
self.text.pack()
self.text.insert(结束,解释文本)
self.label=label(self,textvariable=self.var)
self.label.pack()
def回调_索引(自身、事件):
x=self.text.index(插入)
自变量集(x)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
root=Tk()
app=app(根目录)
root.mainloop()

我相信您看到的问题是,当您按下鼠标时,事件将触发以读取
插入
。问题是,在提起鼠标之前,该位置仍将具有上一次插入的值。因此,为了让您在事件完成后获得更新,我们可以使用
after()
等待事件完成,然后设置
self.var
的值

将您的
callback\u index
方法更改为:

def callback_index(self,event):
    root.after(0, lambda: self.var.set(self.text.index(INSERT)))
我们正在做的是告诉python在设定的时间之后安排一些事情。我相信(如果我错了,请纠正我),因为事件正在进行中,它会等待该事件完成,然后在
after()
方法中执行操作


我们使用
lambda
创建一个匿名函数来更新您的
self.var
变量,所有变量都应按预期工作。

在某些事件中会发生这种情况。它在列表框中也很明显。您只需要使用
after()
解决这个问题。也可能有其他的解决方案,但这对我来说很有效。