2017-05-12 4 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>が1つあることが必要です。解決方法はMainWindowと同じようにsuper().__init__(master)です。

+0

*は*微妙です。ありがとう!それは今、完璧に動作します。 – user3486991

関連する問題