123456789
123456789

Reputation: 23

How to close the Tkinter window when the mouse clicked away from the Tkinter window?

Good days all, I am new here, and I have stuck the problem a few days a problem currently with Tkinter, I have done some research about how to close Tkinter window when the mouse has clicked away from it but there are not much information to do so.

So, my problem is how to close the Tkinter window when the mouse clicked outside the Tkinter? I have tried the method of FocusOut to my Tkinter. However, I have tried to bind with root, it will close the window even though I clicked inside the frame widget. Then, I bind with the frame, the Tkinter will close when I clicked outside the Tkinter. Therefore, I have proved that the idea to close the Tkinter is works so far.

Then a new problem has happened, when I clicked the Combobox widget in the window, the window will close also. Is there any better solution to prove this concept?

Here is the code to indicate my problem.

import tkinter as tk
from tkinter import StringVar, ttk,messagebox


root = tk.Tk()
root.title("Sample Window")
root.minsize(300,350)

info_frame = tk.LabelFrame(root, text = "Information")
info_frame.pack(padx = 5, pady = 5 , fill = "both",expand=True)

tabControl = ttk.Notebook(info_frame)
person1tab = ttk.Frame(tabControl)
tabControl.add(person1tab,text = "Person1")
tabControl.pack(expand=1,fill="both")

person2tab = ttk.Frame(tabControl)
tabControl.add(person2tab,text = "Person2")
tabControl.pack(expand=1,fill="both")

fname_var = tk.StringVar()
lname_var = tk.StringVar()
gender_var = tk.StringVar()
age_var = tk.IntVar()

fname_label = tk.Label(person1tab, text = "First name:").pack(padx=5,pady=3)
fname_entry = tk.Entry(person1tab, textvariable=fname_var).pack(padx=5,pady=3)

lname_label = tk.Label(person1tab, text = "Last name:").pack(padx=5,pady=3)
lname_entry = tk.Entry(person1tab, textvariable=lname_var).pack(padx=5,pady=3)

gender_label = tk.Label(person1tab, text = "Gender:").pack(padx=5,pady=3)
gender_combo =  ttk.Combobox(person1tab, textvariable=gender_var,state='readonly')
gender_combo['values'] = ('Male','Female')
gender_combo.current(0)

gender_combo.pack(padx=5,pady=3)

age_label = tk.Label(person1tab, text = "Age:").pack(padx=5,pady=3)
age_label = tk.Entry(person1tab, textvariable=age_var).pack(padx=5,pady=3)

page2label = tk.Label(person2tab,text = "This is tab 2.").pack(padx=5,pady=3)

def lossfocus(event):
    root.quit()
    pass

tabControl.bind('<FocusOut>', lossfocus)

root.mainloop()

Upvotes: 2

Views: 1313

Answers (1)

acw1668
acw1668

Reputation: 46751

You can still bind <FocusOut> on root window, but you need to check:

  • whether the widget that trigger this event is root window
  • no other widget in this root window getting the focus:
def lossfocus(event):
    if event.widget is root:
        # check which widget getting the focus
        w = root.tk.call('focus')
        if not w:
            # not widget in this window
            root.destroy()

Upvotes: 3

Related Questions