首页 > 解决方案 > 有没有办法在 python 中检测 2 个小部件上的 FocusOut 事件

问题描述

我想要的是只要我在 dateEntry 小部件上就可以自由选择日期(即使我单击向下箭头,这个小部件也不会被破坏)并在我单击其他地方时销毁最后一个(dateEntry)。

问题是 tkcalender 是由多个小部件组成的,这就是为什么只在其中一个上设置 focusOut 事件的原因。

from tkinter import *
from tkcalendar import DateEntry

def ok(e):
    print(cal.get_date())


root = Tk()
cal = DateEntry(root, year=2010)
cal.pack(padx=10, pady=10)
cal.bind('<FocusOut>', lambda e: cal.destroy())
cal.bind('<Return>', ok)  # validate with Enter
cal.focus_set()

root.mainloop()

如果您运行代码,那么您单击 DateEntry 的箭头,这个被破坏了,我希望这个保留在那里,直到您单击窗口中其他要被破坏的地方。

标签: pythontkintertkcalendar

解决方案


如果我理解正确,您希望在DateEntry单击打开日历时不被破坏。这可以通过检查您当前的焦点以及pass当前焦点是否是一个Calendar对象来实现。

import tkinter as tk
from tkcalendar import DateEntry, Calendar

def check_focus(event):
    current = root.focus_get()
    if not isinstance(current,Calendar):
        cal.destroy()

root = tk.Tk()

cal = DateEntry(root, year=2010)
cal.pack(padx=10, pady=10)
cal.bind('<FocusOut>', check_focus)
tk.Button(root,text="Click").pack()

root.mainloop()

尝试按 Tab 键更改焦点并查看。


推荐阅读