Python Tkinter如何正确使用绑定?

时间:2017-09-20 17:49:31

标签: 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 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()

1 个答案:

答案 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变量,并且所有变量都应按预期工作。