2017-05-12 1 views
1

프레임에 입/출입구에 바인딩하고 싶습니다. 꽤 쉽습니다. 프레임에있는 일부 위젯에 마우스를 올리면 프레임에서 빠져 나옵니다 (프레임이 위젯 영역에서 "보이지"않기 때문에). 텍스트 필드 (Label)를 표시 한 다음 프레임 입력시 편집 가능한 필드로 변경하는 다음 코드를 실행하여 효과가 적용됩니다. 버튼이 텍스트 영역 자체에 있으면 레이블로 돌아갑니다. . 'TextArea에서 :이 문제를 해결하는 방법을 임신의 문제가트래핑 프레임 입구 tkinter

from tkinter import * 
class MainWindow(Frame): 
    def __init__(self,master): 
     super().__init__(master) 
     self.master = master 
     #self.master.state('zoomed') 
     self.pack() 
     self.edit = 0 
     self.initUI() 

    def initUI(self): 
     self.c = Canvas(self, height = 100, width = 400, bg = "red") 
     self.c.pack() 
     self.bind('<Enter>', lambda *args: textarea.display(1)) 
     self.bind('<Leave>', lambda *args: textarea.display(0)) 
     self.textstring = StringVar() 
     self.textstring.set("Hello") 
     textarea = TextArea(self.c,self.edit,self.textstring) 
     textarea.display(2) 
     self.c.create_window(10,10,window = textarea,anchor = NW) 

class TextArea(Frame): 
    def __init__(self,master,active,textstr): 
     super().__init__() 
     self.master = master 
     self.active = active 
     self.textstr = textstr 
     self.inflag = False 

    def display(self,e): 
     if e == 0: 
      for child in self.winfo_children(): 
       child.destroy() 
      L = Label(self,text = self.textstr.get(),relief = "flat") 
      L.pack() 
     elif e ==1: 
      for child in self.winfo_children(): 
       child.destroy() 
      E = Entry(self,textvariable = self.textstr,width = 10) 
      E.pack() 
     elif e == 2: 
      L = Label(self, text=self.textstr.get(), relief="flat") 
      L.pack() 

root = Tk() 
mainframe = MainWindow(root) 
mainframe.pack() 
root.mainloop() 

답변

3

여기에 실제 문제는 오히려 미묘하다. (나는 프레임에 트랩 입구를 필요뿐만 아니라 텍스트 영역이 그냥 장난감 예입니다) s __init__, master 매개 변수를 수퍼 클래스에 전달하지 못했기 때문에 기본값은 a 루트 윈도우의 자식. 즉, TextArea는 실제로 사용자가 의도 한 자손이 아닌 MainWindow의 형제입니다. 따라서 <Enter> 다른 하나는 <Leave>이 있어야합니다. 해결책은 MainWindow에서했던 것처럼 super().__init__(master)입니다.

+0

* 미묘합니다. 감사! 이제 완벽하게 작동합니다. – user3486991