这是一个使用来自user32 dll 的FlashWindowEx 的Windows 解决方案。您需要将 FLASHWINFO 对象传递给它。 grab_set 确保弹出窗口保持焦点并禁用主窗口中的任何小部件,使弹出窗口瞬态确保它始终位于主窗口之上。 <Button-1> 事件用于检查鼠标单击,winfo_containing 检查是否单击了弹出窗口以外的其他窗口。然后我将焦点设置回弹出窗口并闪烁焦点窗口(然后始终是弹出窗口)。
您需要pywin32 才能使用它。
import Tkinter as tk
from ctypes import *
import win32con
class popup(object):
def __init__(self, parent):
self.parent = parent
self.root=tk.Toplevel(self.parent)
self.root.title("Popup")
self.root.grab_set()
self.root.transient(self.parent)
self.root.bind("<Button-1>", self.flash)
def flash(self, event):
if self.root.winfo_containing(event.x_root, event.y_root)!=self.root:
self.root.focus_set()
number_of_flashes = 5
flash_time = 80
info = FLASHWINFO(0,
windll.user32.GetForegroundWindow(),
win32con.FLASHW_ALL,
number_of_flashes,
flash_time)
info.cbSize = sizeof(info)
windll.user32.FlashWindowEx(byref(info))
class FLASHWINFO(Structure):
_fields_ = [('cbSize', c_uint),
('hwnd', c_uint),
('dwFlags', c_uint),
('uCount', c_uint),
('dwTimeout', c_uint)]
main = tk.Tk()
main.title("Main")
pop = popup(main)
main.mainloop()
现在,闪烁只在单击主窗口的主体时发生,因此单击标题栏只会将焦点返回到弹出窗口而不闪烁。要让它在发生这种情况时也触发,您可以尝试使用<FocusOut> 事件,但您必须确保它仅在焦点传递到主窗口时发生,但自从使用grab_set 以来它从未真正发生过。您可能想弄清楚这一点,但现在它工作得很好。所以它并不完美,但我希望它有所帮助。