Python-ZZY 2022-08-22 01:22 采纳率: 48.1%
浏览 69
已结题

Python tkinter如何在任务栏处闪动一下窗口?

我正在编写一个聊天程序,用的是tkinter,希望能够在收到消息的时候,使任务栏处的窗口闪动一下(就像微信和qq收到消息后一样)。如何做到闪动一下窗口?

  • 写回答

1条回答 默认 最新

  • Smart-Space 2022-08-22 03:01
    关注

    可以使用winapi(user32)的FalshWindow功能。
    下面是示例:

    1. from tkinter import *
    2. from tkinter import ttk
    3. from ctypes import *
    4. u32=windll.user32
    5. def test():
    6. u32.FlashWindow(u32.GetParent(r.winfo_id()),True)
    7. print('yes')
    8. r=Tk()
    9. r.title('test tkinter')
    10. r.after(3000,test)
    11. r.mainloop()

    当窗口没有焦点时,会触发FlashWindow。如果想要定义更多内容,可以使用FalshWindowEx
    关于后者,见https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-flashwindowex

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    Python-ZZY 2022-08-29 00:44

    感谢!我还有一个问题,是否能在任务栏的窗口位置显示进度条?就像浏览器下载的时候会在任务栏的位置显示下载进度

    回复
    Smart-Space 回复 Python-ZZY 2022-08-29 02:46

    这需要用到com组件,单纯的ctypes无法解决。

    1. #https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nn-shobjidl_core-itaskbarlist3
    2. from tkinter import *
    3. from tkinter import ttk
    4. import ctypes
    5. import time
    6. u32=ctypes.windll.User32
    7. CLSID_TaskbarList = "{56FDF344-FD6D-11d0-958A-006097C9A090}"
    8. IID_ITaskbarList3 = "{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}"
    9. import comtypes.client as cc
    10. cc.GetModule("TaskbarLib.tlb")
    11. import comtypes.gen.TaskbarLib as tbl
    12. ef = cc.CreateObject("{56FDF344-FD6D-11d0-958A-006097C9A090}",interface=tbl.ITaskbarList3)
    13. TBPF_NOPROGRESS = 0x00000000
    14. TBPF_INDETERMINATE = 0x00000001
    15. TBPF_NORMAL = 0x00000002
    16. TBPF_ERROR = 0x00000004
    17. TBPF_PAUSED = 0x00000008
    18. def test():
    19. b1['state']='disable'
    20. hwnd=u32.GetParent(root.winfo_id())
    21. ef.SetProgressState(hwnd,TBPF_INDETERMINATE)
    22. total=100#总计任务量 任意
    23. completed=1#完成任务量 任意
    24. #===你的耗时代码===
    25. while completed<=total:
    26. ef.SetProgressValue(hwnd,completed,total)
    27. completed+=1
    28. time.sleep(0.05)
    29. #======
    30. ef.SetProgressState(hwnd, TBPF_NOPROGRESS)
    31. b1['state']='normal'
    32. root=Tk()
    33. root.geometry('300x300+10+10')
    34. b1=ttk.Button(root,text='开始进度测试',command=test)
    35. b1.pack()
    36. root.mainloop()

    这个代码理论上是可以的,但是我没办法导入TaskbarLib.tlb,或许可以到其它地方下载。

    没办法,python本身不支持com。

    回复
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 9月5日
  • 已采纳回答 8月29日
  • 创建了问题 8月22日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部