<p>下面是一个Windows解决方案,它使用<code>user32</code>dll中的<a href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms679347(v=vs.85).aspx" rel="nofollow">^{<cd1>}</a>。您需要向它传递一个<a href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms679348(v=vs.85).aspx" rel="nofollow">^{<cd3>}</a>对象。<code>grab_set</code>确保弹出窗口保持焦点并禁用主窗口中的任何窗口小部件,使弹出窗口暂时性确保它始终位于主窗口的顶部。<code><Button-1></code>事件用于检查鼠标单击,<code>winfo_containing</code>检查是否单击了弹出窗口之外的其他窗口。然后我将焦点设置回弹出窗口,并在焦点处闪烁窗口(然后总是弹出窗口)。在</p>
<p>你需要<a href="http://sourceforge.net/projects/pywin32/" rel="nofollow">pywin32</a>才能使用这个。在</p>
<pre><code>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()
</code></pre>
<hr/>
<p>现在,只有在单击主窗口的主体时才会出现闪烁,所以单击标题栏只会将焦点返回到弹出窗口而不闪烁。要使它在这种情况下也能触发,可以尝试使用<code><FocusOut></code>事件,但必须确保它只在焦点转移到主窗口时发生,但由于使用了<code>grab_set</code>,所以它从来没有真正触发过。你可能想弄清楚,但现在它运行得很好。所以这并不完美,但我希望能有所帮助。在</p>