2017-07-31 4 views
1

私は、LabelFrameのアイテムのリストボックスとそのカウントを表示するポップアップウィンドウ(装飾なし)を表示する次のコードを持っています。フレーム<Leave>イベントをすべての子ウィジェットを考慮に入れる方法?

これはポップアップウィンドウなので、カーソルが外に出るとそのウィンドウが非表示になります。

マウスカーソルがフレームから離れるとウィンドウが消えますが、マウスがScrollbarを移動すると消えます。

Scrollbarが取られていない間、いくつかの理由で、オブジェクト自体に<Leave>を結合することは考慮にもListboxをとります。

なぜですか?どのようにしてフレームのすべてのウィジェットにマウスを置くと、フレームが表示されたままになるようにコードを修正できますか?フレーム全体から移動するときだけ消えます。

class ForeachViewer(Toplevel): 
    def __init__(self, parent): 
     Toplevel.__init__(self, parent) 

     self.overrideredirect(True) 
     self.main_frame = LabelFrame(self, text="Total:") 
     self.main_frame.pack(expand=1, fill='both', padx=5, pady=5) 

     self.content_items = StringVar() 
     self.group_expansion = Listbox(self.main_frame, 
             activestyle = 'none', 
             selectmode='single', 
             font=text_font, 
             listvariable = self.content_items, 
             relief='flat', 
             highlightthickness = 0) 
     self.group_expansion.grid(row=1, column=1, sticky="nswe") 

     self.yscrollbar = Scrollbar(self.main_frame, orient='vertical') 
     self.yscrollbar.grid(row=1, column=2, sticky='ns') 

     self.group_expansion.configure(yscrollcommand=self.yscrollbar.set) 
     self.yscrollbar.configure(command=self.group_expansion.yview) 

     self.bind("<Leave>", lambda event : self.hide()) 
     self.hide() 

    def contents(self, content): 
     max_length = len(max(content, key=len)) + 5 
     self.main_frame.configure(text= " Total Items: %d" % len(content)) 
     self.group_expansion.configure(state="normal", width=max_length) 
     self.content_items.set(" ".join(content)) 
     self.group_expansion.configure(state="disable") 

    def show(self, at_x, at_y): 
     self.geometry("+%d+%d" % (at_x, at_y)) 
     self.deiconify() 

    def hide(self): 
     self.withdraw() 

答えて

0

それはクラス型の結合をかなりうまく動作します:最初の引数は、イベントの対象となるタイプであり、それはあなたの「ボタン」または基本クラスのトップレベル "することができ

self.bind_class('Toplevel',"<Leave>", lambda event : self.hide()) 

例。

関連する問題