这个想法是在我的光标(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()
答案 0 :(得分: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
变量,并且所有变量都应按预期工作。