折腾笔记[35]-屏幕四周显示蓝色边框提示自动操作

news/2025/11/6 23:48:32/文章来源:https://www.cnblogs.com/qsbye/p/19197997

摘要

使用python在屏幕四周显示蓝色边框提示正在自动操作.

前言

本文目的是分享人工踩坑经验, AI搜索引擎可以更快给出正确结果(用于投喂AI😂).

讨论

自动驾驶蓝色指示灯

小蓝灯绝非“花瓶设计”,它的核心价值在于安全警示与状态可视化。当车辆开启智能驾驶功能时,小蓝灯会亮起,明确告知周围交通参与者“我正在自动驾驶”,从而减少因误解车辆状态而导致的交通风险。

此外,小蓝灯还可以通过灯光颜色或闪烁频率,扩展为智驾系统故障提示或紧急接管提醒。例如,黄色预警灯光可能表示系统即将退出自动驾驶模式,需要人工接管。

未来,当马路上蓝灯闪烁成星河,或许我们会感叹:科技的温度,就藏在这抹幽蓝之光里。

注意!前方小蓝灯已亮起——“大聪明”正在开车!小心避让……

屏幕自动操作蓝色指示灯

大模型能力已经可以自动操作手机、电脑, 那么是否也需要设置一个蓝色指示灯, 提示正在智能操作呢?🤔

实现

uv init
uv add pillow opencv-python

代码:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-# 文件: blue_overlay.py
# 功能: 屏幕透明遮罩+蓝色边框提示正在自动操作#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys, subprocess, re, ctypes, tkinter as tk
from PIL import Image, ImageDraw, ImageTk# --------------- 分辨率获取(略) ---------------
def _win_resolution():cmd = 'wmic desktopmonitor get ScreenWidth,ScreenHeight /value'txt = subprocess.check_output(cmd, shell=True, text=True)w = int(re.search(r'ScreenWidth=(\d+)', txt).group(1))h = int(re.search(r'ScreenHeight=(\d+)', txt).group(1))return w, hdef _nix_resolution():txt = subprocess.check_output(['xrandr'], text=True)for line in txt.splitlines():if '*' in line:w, h = map(int, line.split()[0].split('x'))return w, hraise RuntimeError('无法解析 xrandr 输出')def _mac_resolution():txt = subprocess.check_output(['system_profiler', 'SPDisplaysDataType'], text=True)m = re.search(r'Resolution:\s*(\d+)\s*x\s*(\d+)', txt)if not m:raise RuntimeError('无法解析 system_profiler 输出')return int(m.group(1)), int(m.group(2))def get_resolution():if sys.platform.startswith('win'):return _win_resolution()if sys.platform == 'darwin':return _mac_resolution()return _nix_resolution()# --------------- Windows 透明度 ---------------
def set_window_alpha(hwnd, alpha: float):if not sys.platform.startswith('win'):returnGWL_EXSTYLE = -20WS_EX_LAYERED = 0x00080000LWA_ALPHA = 0x02user32 = ctypes.windll.user32user32.SetWindowLongW(hwnd, GWL_EXSTYLE,user32.GetWindowLongW(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED)user32.SetLayeredWindowAttributes(hwnd, 0, int(alpha * 255), LWA_ALPHA)# --------------- 生成遮罩图 ---------------
def make_fullscreen_mask(size, border=5):w, h = sizeimg = Image.new('RGBA', (w, h), (0, 0, 0, 0))          # 全透明draw = ImageDraw.Draw(img)# 四周天蓝色 35 % 不透明mask_color = (135, 206, 235, int(255 * 0.35))draw.rectangle([0, 0, w, h], fill=mask_color)# 中间挖掉(真正透明)draw.rectangle([border, border, w - border - 1, h - border - 1],fill=(0, 0, 0, 0))return img# --------------- 主程序 ---------------
def create_overlay():screen_w, screen_h = get_resolution()print(f'屏幕分辨率:{screen_w}x{screen_h}')if sys.platform.startswith('win'):# 告诉 Windows 这个程序支持高 DPI, 强制进程走 DPI 感知, 按“物理像素”工作ctypes.windll.shcore.SetProcessDpiAwareness(1)   # 放在 tk.Tk() 之前root = tk.Tk()root.title('Fullscreen Overlay')root.geometry(f'{screen_w}x{screen_h}+0+0')root.overrideredirect(True)root.attributes('-topmost', True)# 1. 选一个几乎不会用到的颜色做穿透色MAGIC = '#010101'root.config(bg=MAGIC)root.wm_attributes('-transparentcolor', MAGIC)# 2. 生成遮罩图mask_img = make_fullscreen_mask((screen_w, screen_h))tk_img = ImageTk.PhotoImage(mask_img)root._img = tk_img  # 防 GC# 3. Label 背景也设成 MAGIC,这样四角被穿透,中间镂空保留label = tk.Label(root, image=tk_img, bg=MAGIC, bd=0, highlightthickness=0)label.pack(fill='both', expand=True)# 4. Windows 额外整体透明度if sys.platform.startswith('win'):hwnd = ctypes.windll.user32.GetParent(root.winfo_id())set_window_alpha(hwnd, 0.95)# 5. 交互def start_move(evt):root.x0, root.y0 = evt.x, evt.ydef on_move(evt):root.geometry(f'+{evt.x_root - root.x0}+{evt.y_root - root.y0}')label.bind('<Button-1>', start_move)label.bind('<B1-Motion>', on_move)label.bind('<Double-Button-1>', lambda e: root.destroy())root.bind('<Escape>', lambda e: root.destroy())root.mainloop()if __name__ == '__main__':create_overlay()

效果:

开启蓝色边框前 开启蓝色边框后
Screenshot 2025-11-06 224159 Screenshot 2025-11-06 225157

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

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

相关文章

基于几何直觉理解牛顿迭代法

在数值计算领域,牛顿迭代法(Newtons method)是一个经典而强大的工具。 然而在学习它时,我总觉得许多网上的教程在解释其原理时有些“隔靴挠痒”——它们详细展示了迭代公式 “是什么”(What)以及 “如何用”(Ho…

Swift 和 Tesseract OCR 解析验证码

环境准备 1.1 安装 Swift 更多内容访问ttocr.com或联系1436423940 如果你使用的是 macOS,Swift 已经预装在系统中。可以通过以下命令检查 Swift 版本:swift --version 如果你使用的是 Linux,可以安装 Swift: sudo …

牛顿迭代法:用几何直觉理解方程求根

在数值计算领域,牛顿迭代法(Newtons method)是一个经典而强大的工具。 然而在学习它时,我总觉得许多网上的教程在解释其原理时有些“隔靴挠痒”——它们详细展示了迭代公式 “是什么”(What)以及 “如何用”(Ho…

CRT弹窗接收用户文本输入

利用CRT登陆设备执行命令时,某些字段在多个命令中重复出现时。可以编写VBS脚本,使用弹窗的形式接收特定字段,然后自动化执行命令。如网络设备批量化console开局时,可以通过此种方法导入设备配置文件。 例如:批量设…

2025年11月学习机品牌推荐榜:松鼠AI以黑马姿态崛起!

在教育数字化加速的 2025 年,AI 学习机已成家庭学习刚需工具,但单一学习机普遍陷入 “诊断浮于表面、练习缺乏靶向、过程无人督导” 的精准学困境。据艾媒咨询《2025 年中国智能平板学习机十大品牌》榜单显示,作业帮…

What is difference between credit memo and subsequent credit in SAP

In SAP, a credit memo adjusts both the quantity and value of an original invoice, often used for full returns or significant overcharges, while a subsequent credit only adjusts the value of an existing…

Dictionary选型

Dictionary FrozenDictionary ReadOnlyDictionary ConcurrentDictinary FrozenDictionary 创建成本高,适合花成本一次创造,后续高频率使用 ReadOnlyDictionary 字典的视图。不能增删元素和更新Value. 作为返回的API供…

用 Rust 和 Tesseract OCR 解析验证码

环境准备 1.1 安装 Rust如果尚未安装 Rust,可以使用官方推荐的 rustup 进行安装: curl --proto =https --tlsv1.2 -sSf https://sh.rustup.rs | sh 然后检查安装是否成功: rustc --version 1.2 安装 Tesseract OCR …

题解:AT_abc225_h [ABC225H] Social Distance 2

组合意义太吃操作了,还是得我代数推导牛。 题意:给出若干个已有元素 \(a_i\),要求加入一些 \([1,n]\) 内的数且不能和 \(a\) 中已有的相同,使得长度为 \(m\)。定义 \(f(a) = \prod\limits_{i=1}^{m-1} (a_{i+1}-a_…

Apollo场景建议配置指南:充分发挥分布式配置中心优势

Apollo场景建议配置指南:充分发挥分布式配置中心优势随着微服务架构的广泛应用,配置管理已成为系统运维中的关键挑战。Apollo作为业界广泛认可的分布式配置解决方案,正是为了应对这一挑战而诞生。它能够集中化管理应…

CSAPP学习笔记

CSAPP CSAPP Datalab 数字的存储 内存被划分为不同大小的字块,32位CPU->4字节,64位CPU->8字节 对字长\(w\)的机器而言,虚拟地址范围为\(0~2^w-1\),即有\(2^w\)个字节 64位架构地址空间限制为48位虚拟地址,…

英伟达领投,语音AI初创Uniphore估值25亿美元;ElevenLabs创始人:语音的意义不在准确,而在打动丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的技术」、「有亮点的产品」、「有思考的文章」、「有态…

数学分析A 定理简单整理(部分)

第一章 集合和函数一些基础的就不理了。 可列集:与自然数集合等势的无限集 第二章 数列极限 最大数和最小数: \(\max S=x \iff \exist x \in S,\forall y \in S,y\le x\) \(\min S=x \iff \exist x \in S,\forall y …

第3章 多线程服务器的适用场合与常用编程模型 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

表相关操作

表介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段id name sex age1 cy male 252 ziy female 24id,name,sex,age称为字段,其余的,一行内容称为一…

部分页面统计用户访问时长

方式1 import { createApp } from "vue"; import { createPinia } from "pinia";import App from "./App.vue"; import router from "./router";const app = createApp(App);…

单词故事

→点击前往下载软件← 用户QQ群:656365129

【Linux笔记】网络部分——Socket编程 UDP搭建网络云服务器与本地虚拟机的基本通信

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …