如何让Tkinter新窗口在任务栏闪烁橙色直至被点击?
Tkinter实现任务栏闪烁提醒
Tkinter本身没有原生支持任务栏窗口闪烁的功能,这属于系统级交互,需要调用对应系统的API来实现。下面以Windows系统为例,通过ctypes调用系统API实现窗口在任务栏闪烁橙色提醒,直到用户点击窗口为止:
完整代码实现
import tkinter as tk import ctypes from ctypes import wintypes # 定义Windows API相关结构体和函数 class FLASHWINFO(ctypes.Structure): _fields_ = [ ("cbSize", wintypes.UINT), ("hwnd", wintypes.HWND), ("dwFlags", wintypes.DWORD), ("uCount", wintypes.UINT), ("dwTimeout", wintypes.DWORD) ] FLASHW_ALL = 0x00000003 # 闪烁窗口标题和任务栏按钮 FLASHW_TIMERNOFG = 0x0000000C # 持续闪烁直到窗口获得焦点 user32 = ctypes.WinDLL("user32") FlashWindowEx = user32.FlashWindowEx FlashWindowEx.argtypes = [ctypes.POINTER(FLASHWINFO)] FlashWindowEx.restype = wintypes.BOOL def flash_window(window): # 获取窗口句柄 hwnd = wintypes.HWND(window.winfo_id()) flash_info = FLASHWINFO() flash_info.cbSize = ctypes.sizeof(FLASHWINFO) flash_info.hwnd = hwnd flash_info.dwFlags = FLASHW_ALL | FLASHW_TIMERNOFG flash_info.uCount = 0 # 无限闪烁 flash_info.dwTimeout = 0 # 系统默认间隔 FlashWindowEx(ctypes.byref(flash_info)) def stop_flash(window): hwnd = wintypes.HWND(window.winfo_id()) flash_info = FLASHWINFO() flash_info.cbSize = ctypes.sizeof(FLASHWINFO) flash_info.hwnd = hwnd flash_info.dwFlags = 0 # 停止闪烁 flash_info.uCount = 0 flash_info.dwTimeout = 0 FlashWindowEx(ctypes.byref(flash_info)) # 创建主窗口 end = tk.Tk() end.title('FreteFinder') end.geometry("450x250") end.eval('tk::PlaceWindow . center') # 修正原代码笔误:将win.focus_force()改为end.focus_force() end.after(1000, lambda: end.focus_force()) # 绑定焦点事件:失去焦点时开始闪烁,获得焦点时停止闪烁 end.bind("<FocusOut>", lambda e: flash_window(end)) end.bind("<FocusIn>", lambda e: stop_flash(end)) # 添加提示标签 label = tk.Label(end, text="Novo Frete Encontrado!", font=("Arial", 20)) label.place(anchor=tk.CENTER, relx=0.5, rely=0.5) end.mainloop()
代码说明
- 通过
ctypes调用Windows系统的user32.dll中FlashWindowEx函数,这是系统原生的窗口闪烁接口。 FLASHW_TIMERNOFG参数控制窗口持续闪烁,直到用户点击窗口获取焦点后自动停止。- 绑定
<FocusOut>和<FocusIn>事件,实现窗口焦点变化时的闪烁启停逻辑。 - 修正了原代码中
win.focus_force()的笔误,确保窗口创建后能正常自动获取焦点。
其他系统适配提示
- macOS:可借助
pyobjc库调用AppKit框架的NSWindow相关方法实现任务栏闪烁。 - Linux:不同桌面环境实现方式不同,可尝试调用GTK相关API或使用
xdotool工具触发闪烁。
内容的提问来源于stack exchange,提问作者VicSeraco
相关产品推荐
相关产品推荐

