2017-05-12 40 views
1

我想綁定到框架的入口/出口。這很容易,但是當我將鼠標懸停在Frame中的某個窗口小部件上時,它被困在Frame的退出位置(我猜想,因爲Frame在窗口小部件區域中不是「可見」的,你可以看到這個通過運行下面的代碼來實現這種效果,這是爲了顯示文本字段(標籤),然後在輸入框架時更改爲可編輯字段。一旦該按鈕位於文本區域本身,就返回到標籤。 。爲解決這個構思一個方式的麻煩(我需要陷阱入口框架,不只是文本區域這僅僅是一個玩具的例子)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

這裏的實際問題是相當微妙:在TextArea「 s __init__,您未能將master參數傳遞給超類,因此它默認爲根窗口的孩子。換句話說,TextArea實際上是MainWindow的一個兄弟,而不是你想要的後代。因此有必要從一個<Leave>到另一個<Enter>。解決辦法是做super().__init__(master),就像你在MainWindow中做的一樣。

+0

*是*微妙。謝謝!它現在完美。 – user3486991