Home > Blockchain >  Tkinter - Seperate 'Button' class with different TopLevel
Tkinter - Seperate 'Button' class with different TopLevel

Time:09-18

I have a problem with bind_class. I want to bind some events for all buttons in my topLevel mainWindow. But my other topLevel themeWindow's buttons also effected from this.

My code:

root = tk.Tk()
mainWindow = Toplevel(root)
themeWindow = Toplevel(root)
#my buttons and labels
mainWindow.bind_class('Button', '<Enter>', onCursorButton, add=' ')
mainloop()

And themeWindow's buttons keep effecting from <Enter> and <Leave> event.

CodePudding user response:

Try this code:

import tkinter as tk


def get_masters(widget):
   output = []
   while widget.master is not None:
      widget = widget.master # Get the widgets master
      output.append(widget)  # Append it to the list
      if isinstance(widget, tk.Toplevel): # If we incounter a toplevel stop
         break
   return output


def function(event):
   print("Is the widget's master `main_window`?: ", main_window in get_masters(event.widget))
   # Check if the widget that caused the event is in `main_window`
   if main_window in get_masters(event.widget):
      print("Hangle event")
   else:
      print("Ignore event")


root = tk.Tk()
main_window = tk.Toplevel(root)
theme_window = tk.Toplevel(root)

button = tk.Button(main_window, text="Main Window")
button.pack()

button = tk.Button(theme_window, text="Theme Window")
button.pack()

main_window.bind_class("Button", "<Enter>", function, add=" ")
root.mainloop()

The function get_masters returns a list of all of the frames window that the widget is in. In function, we check if the widget that caused the even is in main_window or not. Based on that we can either handle or ignore the event.

  • Related