使用tkinter创建一个弹出列表

时间:2016-12-28 18:17:40

标签: python tkinter

我想做什么:

  1. 按一下按钮。
  2. 如果将鼠标悬停在其上,则会出现一个顶层,如果您移除光标,则顶部消失。
  3. 如果您将光标从按钮移动到此顶层,则它不会(!)消失,如果您将光标移动到其他位置,它最终会消失。
  4. 为此,我创建了2个类(按钮和顶层)。我尝试将 Enter 保留绑定到他们两个,但这会导致2个问题:

    1. 如果您从按钮移动光标,则顶层应该被破坏,但它是使用func_1创建的,并且会被func_2销毁,从而导致错误。
    2. 要将光标从按钮移动到顶级安全,我尝试删除按钮的 保留绑定,然后将其添加回顶层的保留绑定但是它只会导致更多问题。
    3. 这就是我现在所拥有的:

      import tkinter as tk
      
      
      class PopupButton(tk.Button):
          def __init__(self, *args, **kwargs):
              tk.Button.__init__(self, *args, **kwargs)
      
              self.bind("<Enter>", self.button_enter)
              self.bind("<Leave>", self.button_leave)
      
          def button_enter(self, event):
              self.configure(bg="grey")
              toplevel = Popup(root, bg="lightblue")
              toplevel.overrideredirect(1)
      
              x = root.winfo_x()
              y = root.winfo_y()
              toplevel.geometry("100x100+{}+{}".format(x+160, y+485))
      
          def button_leave(self, event):
              self.configure(bg="black")
              pass
              # problem here
      
      
      class Popup(tk.Toplevel):
          def __init__(self, *args, **kwargs):
              tk.Toplevel.__init__(self, *args, **kwargs)
      
              self.bind("<Enter>", self.toplevel_enter)
              self.bind("<Leave>", self.toplevel_leave)
      
          def toplevel_enter(self, event):
              pass
              # problem here
      
          def toplevel_leave(self, event):
              self.destroy()
      
      
      root = tk.Tk()
      root.configure(bg="white")
      root.geometry("400x600")
      
      button = PopupButton(root, text="Hover over me", font="courier 20", bg="black", fg="white")
      button.pack(side="bottom")
      
      root.mainloop()
      

      这是我能做的最多。感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我接受了问题中给出的代码并修改了button_leave方法,以便当光标离开按钮时,仅当光标没有覆盖时才会销毁顶层(我使用{{1}方法知道光标在哪个小部件中)。我还删除了winfo_containing方法,因为这里不需要它。

toplevel_enter