Python Tkinter如何正确使用绑定?
这个想法显示在我的光标(line.column)所在的标签中。这对.index(INSERT)很有效,但是如果我用文本绑定鼠标右键,它将返回上一个光标位置,而不是当前位置。 似乎回调是在事件之后执行的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
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()
解决这个问题。也可能有其他的解决方案,但这对我来说很有效。