当鼠标离开 Tkinter 窗口时如何关闭 Tkinter 窗口?

时间:2021-07-15 01:31:56

标签: python python-3.x tkinter

美好的一天,我是新来的,我已经把这个问题卡住了几天,这是 Tkinter 当前的一个问题,我已经做了一些关于如何在鼠标点击离开时关闭 Tkinter 窗口的研究,但没有有很多信息可以这样做。

那么,我的问题是当鼠标在 Tkinter 外点击时如何关闭 Tkinter 窗口?我已经在我的 Tkinter 上尝试了 FocusOut 的方法。但是,我尝试与 root 绑定,即使我在框架小部件内部单击,它也会关闭窗口。然后,我 bind 与框架,当我在 Tkinter 外部单击时,Tkinter 将关闭。因此,我已经证明关闭 Tkinter 的想法到目前为止是可行的。

然后出现了一个新问题,当我单击窗口中的 Combobox 小部件时,窗口也会关闭。有没有更好的解决方案来证明这个概念?

这是指示我的问题的代码。

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()

1 个答案:

答案 0 :(得分:2)

您仍然可以在根窗口上绑定 <FocusOut>,但您需要检查:

  • 触发该事件的widget是否是根窗口
  • 此根窗口中没有其他小部件获得焦点:
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()
相关问题