2017-09-20 1 views
2

아이디어가 내 커서 (line.column)가있는 레이블에 표시되었습니다. 어떤 작품. 인덱스 (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))) 

우리가 설정 한 시간 이후에 일어날 일을 예약 파이썬을 말하고하고 있습니다. 나는 (내가 틀렸다면 나를 바로 잡는다) 사건이 진행 중이므로 그 사건이 끝날 때까지 기다렸다가 after() 방법으로 행동을 수행 할 때까지 기다린다.

lambda을 사용하여 self.var 변수를 업데이트하는 익명의 함수를 만들고 모두 의도 한대로 작동해야합니다.

+0

시에라 당신은 절대적으로 맞습니다. –

+0

그것은 어떤 사건에서 발생합니다. Listbox에서도 눈에.니다. 당신은'after()'로 그 문제를 해결할 필요가있다. 다른 해결책도있을 수 있지만 이것은 나를 위해 일했습니다. –

관련 문제