tkinter实现窗口嵌入桌面

news/2024/7/20 9:50:04/文章来源:https://blog.csdn.net/Dio980/article/details/139246923

在桌面插件例如日历,便签或桌面宠物等等应用,通常希望能够将软件的窗口钉在桌面上,同时又不影响打开的其他窗口(即不是置顶,而是常驻与桌面,即使用win+d也不会将其窗口关闭)。许多桌面美化类软件都有这个功能。

该功能在win10环境下的实现是通过将软件窗口的父窗口设为windows桌面窗口来实现的(所谓桌面实际上也是一个窗口)。平时使用软件时,软件的一些弹窗或子窗口在失焦时并不会被关闭,正是利用了父子窗口的特性。tkinter并没有预设该功能,我们可以通过win32gui来实现。

代码逻辑是:创建tkinter窗口 -> 获取tkinker窗口句柄 -> 获取windows桌面窗口句柄 -> 将tkinter窗口设置为windows桌面的子窗口。在获取windows桌面句柄时有些曲折,因为最上层桌面被藏在几层窗口内,并且底层窗口的命名并不唯一,所以需要进行遍历。

参考:

怎么在桌面上嵌入窗口(使用FindWindow(),FindWindowEx(),EnumChildWindows())_win32gui.findwindowex将窗口置于桌面层-CSDN博客

https://www.cnblogs.com/2018shawn/p/9833276.html

# -*- coding: utf-8 -*-import tkinter as tk
import win32guidef go():#找到第一个WorkerW窗口dwndparent=win32gui.FindWindowEx(None,None,"WorkerW","")dwndviem=False#遍历所有的WorkerW,直至找到具有SHELLDLL_DefView子窗口的那个while(dwndparent):dwndviem=win32gui.FindWindowEx(dwndparent,None,"SHELLDLL_DefView",None)if(dwndviem!=0):breakdwndparent=win32gui.FindWindowEx(None,dwndparent,"WorkerW","")#经实测,有时SHELLDLL_DefView并不在WorkerW下,而是在唯一的Progman窗口下#这和windows是否启用了任务视图(多桌面)有关。在刚刚启动windows时,SHELLDLL_DefView在Progman下。#一旦进入任务视图,SHELLDLL_DefView就进入了WorkerW#因此如果在WorkerW中没有找到SHELLDLL_DefView的话,就再看看Progman中有没有if(dwndparent==0):print('WorkerW not found, change to Progman')dwndparent=win32gui.FindWindow('Progman',None)dwndviem=win32gui.FindWindowEx(dwndparent,None,"SHELLDLL_DefView",None)if(dwndparent==0):print('Progman not found')else:print('Desktop found, starting program')dwdesktopicon=win32gui.FindWindowEx(dwndviem,None,"SysListView32","FolderView");hwnd = win32gui.FindWindow(None,u'First Demo')win32gui.SetParent(hwnd,dwdesktopicon)#设置tkinter窗口属性
root = tk.Tk()
root.title("First Demo")
root.geometry('500x300+100+100')
theLabel = tk.Label(root, text="tkinter窗口!")
theLabel.pack()#窗口启动后100ms运行go()函数
root.after(100,go)#创建窗口
root.mainloop()

此外,如果使用了其他美化桌面的软件,它们会遮盖住桌面的子窗口。可以将美化软件的窗口作为父窗口,也可以实现常驻的功能。要查看窗口,可以用spy++。

TIPS:发现经过SetParent之后tkinter窗口会变得怪怪的,像褪色了一样。并且如果在最开始设置属性时设置了-alpha透明度,整个窗口会直接消失。经过测试,只要把root.attributes()函数放在go()函数最后即可解决该问题,相当于先指定父窗口,再去改变窗口属性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1052887.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】【9】回文数(1047字)

文章目录 [toc]题目描述样例输入输出与解释样例1样例2样例3 提示进阶Python实现 个人主页:丷从心 系列专栏:LeetCode 刷题指南:LeetCode刷题指南 题目描述 给一个整数x,如果x是一个回文整数,返回true;否…

Java数组的使用

Java数组的使用 前言一、数组基本用法什么是数组注意事项创建数组基本语法代码示例注意事项 数组的使用代码示例获取长度 & 访问元素注意事项 下标越界遍历数组编程求平均成绩Mathrandom类现有100个学生,编程求平均成绩 使用 for-each 遍历数组 二、数组作为方法…

解线性方程组——最速下降法及图形化表示 | 北太天元 or matlab

一、思路转变 A为对称正定矩阵, A x b Ax b Axb 求解向量 x x x这个问题可以转化为一个求 f ( x ) f(x) f(x)极小值点的问题,为什么可以这样: f ( x ) 1 2 x T A x − x T b c f(x) \frac{1}{2}x^TAx - x^Tb c f(x)21​xTAx−xTbc 可…

tty/pty/console/getty/shell/telnet

tty 终端(termimal)= tty(Teletypewriter, 电传打印机),作用是提供一个命令的输入输出环境,在linux下使用组合键ctrl+alt+T打开的就是终端,可以认为terminal和tty是同义词。 tty泛指所有的终端设置,这些是真实存在的设备。 通过tty命令可以查看当前终端连接的设备。…

Linux 一键部署alfresco 6

alfresco 前言 Alfresco是一个流行的企业级开源内容管理系统和协作平台。它提供了丰富的功能,包括文档管理、记录管理、协作工具、工作流管理、搜索和版本控制等。Alfresco还具有灵活的部署选项,可以作为本地部署的软件或云服务来使用。 该平台可以帮助组织管理和存储各种类…

WPS文件没有保存怎么恢复?5个解决方案轻松恢复!

“我在WPS上编辑了一个文件,但是还没来得及将它保存,我不小心就退出软件了,现在不知道有什么方法可以恢复WPS文件呢?大家可以帮帮我吗” WPS作为一款功能强大且用户友好的软件,给我们的工作带来了很多的便利。但我们在…

适用于Android的最佳数据恢复软件

如果您的 Android 设备崩溃,您需要找到一种方法来取回您的数据。幸运的是,有许多数据恢复程序可以帮助您恢复丢失的文件。有些是免费的,而另一些则需要付费。这是适用于Android设备的最佳数据恢复软件列表。 什么是数据恢复软件? …

紫光展锐前沿探索 | 满足未来6G多差异化应用场景的技术体系思考

在6G架构/系统设计中,紫光展锐提出了未来6G空口“一体多翼”的技术体系概念,即“Big-Lite Multi-RAT”。本文将详细对该技术体系展开介绍。 “一体多翼”技术体系通过 “体”(Big RAT)和“翼”(Lite RAT)的…

Java语言ADR药物不良反应系统源码Java+IntelliJ+IDEA+MySQL一款先进的药物警戒系统

Java语言ADR药物不良反应系统源码JavaIntelliJIDEAMySQL一款先进的药物警戒系统源码 ADR药物不良反应监测系统是一个综合性的监测平台,旨在收集、报告、分析和评价药品在使用过程中可能出现的不良反应,以确保药品的安全性和有效性。 以下是对该系统的详细…

C#【进阶】俄罗斯方块

俄罗斯方块 文章目录 Test1_场景切换相关BeginScene.csBegionOrEndScene.csEndScene.csGame.csGameScene.csISceneUpdate.cs Test2_绘制对象基类和枚举信息DrawObject.csIDraw.csPosition.cs Test3_地图相关Map.cs Test4_坐标信息类BlockInfo.cs Test5_板砖工人类BlockWorker.…

04_前端三大件JS

文章目录 JavaScript1.JS的组成部分2.JS引入2.1 直接在head中通过一对script标签定义脚本代码2.2创建JS函数池文件,所有html文件共享调用 3.JS的数据类型和运算符4.分支结构5.循环结构6.JS函数的声明7.JS中自定义对象8.JS_JSON在客户端使用8.1JSON串格式8.2JSON在前…

Python与OpenCV:图像处理与计算机视觉实战指南

前言 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,它包含了数百种计算机视觉算法,包括图像处理、视频分析、物体检测、面部识别等。结合Python语言的强大功能,OpenCV可以用于…

java医院管理系统源码(springboot+vue+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的医院管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 医院管理系统的主要使用者分…

【AJAX前端框架】Asynchronous Javascript And Xml

1 传统请求及缺点 传统的请求都有哪些? 直接在浏览器地址栏上输入URL。点击超链接提交form表单使用JS代码发送请求 window.open(url)document.location.href urlwindow.location.href url… 传统请求存在的问题 页面全部刷新导致了用户的体验较差。传统的请求导…

Android15 Beta更新速览

Android15 Beta更新速览 前台服务变更 前台服务使应用保持活动状态,以便它们可以执行关键且对用户可见的操作,通常以牺牲电池寿命为代价。在 Android 15 Beta 2 中,dataSync 和 mediaProcessing 前台服务类型现在具有约 6 小时的超时时间&a…

Python 植物大战僵尸

文章目录 效果图项目结构实现思路源代码 效果图 项目结构 实现思路 下面是代码的实现思路: 导入必要的库和模块:首先,我们导入了Python的os、time库以及pygame库,还有植物大战僵尸游戏中用到的各个植物和僵尸的类。 初始化游戏和…

AI写作工具的革命:AIGC如何提升内容生产效率

AIGC,即人工智能生成内容,是一种新兴的内容生产方式,它利用人工智能技术来自动生成文本、图像、音频、视频等多种形式的内容即进入实际应用层面。 所以AI不再是高深的、让人望尘莫及的算力算法,而是真实地贴近了我们的生活&#…

VectorDBBench在windows的调试

VectorDBBench在windows的调试 VectorDBBench是一款向量数据库基准测试工具,支持milvus、Zilliz Cloud、Elastic Search、Qdrant Cloud、Weaviate Cloud 、 PgVector、PgVectorRS等,可以测试其QPS、时延、recall。 VectorDBBench是一款使用python编写的…

鸿蒙ArkUI-X跨语言调用说明:【平台桥接(@arkui-x.bridge)】

平台桥接(arkui-x.bridge) 简介 平台桥接用于客户端(ArkUI)和平台(Android或iOS)之间传递消息,即用于ArkUI与平台双向数据传递、ArkUI侧调用平台的方法、平台调用ArkUI侧的方法。 以Android平台为例,Ark…

OM电商系统asp.net

OM电商系统,可以让顾客全面了解商品的详细信息,消除网上购物的信息不对称问题。通过商品分类来组织众多的商品,方便顾客找到所需要的商品。提供客服顾客互动机制,提高顾客的参与度。通过设计合理的订单处理流程,提高顾…