当前位置: 首页 > article >正文

Brightness Controller-源码记录

Brightness Controller 亮度控制

  • 一、概述
  • 二、ddcutil 与 xrandr
    • 1. ddcutil
    • 2. xrandr
  • 三、部分代码解析
    • 1. icons
    • 2. ui
    • 3. util
    • init.py

一、概述

项目:https://github.com/SunStorm2018/Brightness.git

在这里插入图片描述
原理:Brightness Controlle 是我在 Ubuntu 发现上调节亮度的一个工具,我觉得很好用,我后面对它的实现比较感兴趣,就去找了他的源项目来满足我的好奇心,也许后面做项目时候会使用,特此记录。

这个小工具是用的 python3 实现,界面使用 pyqt5,控制显示器功能用的命令完成的,会用到 ddcutilxrandr

在亮度调节后台的命令优先使用 ddcutil,其次才使用 xrandr。

二、ddcutil 与 xrandr

这里简单介绍一下 ddcutil

1. ddcutil

ddcutil 是一个 Linux 命令行工具,用于通过 DDC/CI(Display Data Channel Command Interface) 协议与支持该协议的显示器进行通信。它允许用户通过软件控制显示器的硬件设置,如亮度、对比度、输入源等。

  • . 调整显示器设置:
    • 亮度、对比度、音量等。
    • 切换输入源(如 HDMI、DP、VGA)。
    • 调整色彩设置(如 RGB 值)。
  • 查询显示器信息:
    • 获取显示器的制造商、型号、支持的 DDC/CI 功能等。
  • 自动化控制:
    • 通过脚本批量调整多台显示器的设置。

2. xrandr

xrandr 是一个 Linux 命令行工具,用于管理和配置显示器的分辨率、刷新率、旋转、镜像以及多显示器布局。它是 X Window System(Xorg)的一部分,主要用于与 X Server 交互,因此仅适用于运行 Xorg 的 Linux 系统。

三、部分代码解析

1. icons

图标文件夹

2. ui

界面文件夹,包含ui文件,以及通过uic工具对ui文件生成的pyqt脚本文件。
在这里插入图片描述

3. util

包含了基础的工具集

  1. check_displays.py
    查询连接的显示器工具,通过运行 xrandr --query 命令,再对输出用正则匹配出显示器名称
import subprocess
import shlex
import redef query_xrandr():query = "xrandr --query"xrandr_output = subprocess.Popen(shlex.split(query), stdout=subprocess.PIPE,stderr=subprocess.STDOUT)stdout, stderr = xrandr_output.communicate()return str(stdout, "utf-8")def extract_displays(output):pattern = re.compile(r'\b({0})\b'.format("connected"), flags=re.IGNORECASE)lines = output.splitlines()connected = [line for line in lines if pattern.search(line)]connected_displays = list(map(lambda display: display.split()[0], connected))return connected_displaysdef detect_display_devices():"""Detects available displays.returns connected_displaysThis contains the available device names compatible with xrandr"""return extract_displays(query_xrandr())if __name__ == '__main__':print(detect_display_devices())
  1. executor.py
    封装的进程控制器,是调节亮度这些的后台命令
import subprocessdef execute_command(string_cmd):subprocess.check_output(string_cmd, shell=True)

使用的例子如下

def change_value_pr(self, value):"""Changes Primary Display Red ratio"""cmd_value = "xrandr\--output %s \--brightness %s\--gamma %s:%s:%s" % \(self.display1,self.values[self.ui.primary_brightness.value() - 1],self.values[value],self.values[self.ui.primary_green.value()],self.values[self.ui.primary_blue.value()])Executor.execute_command(cmd_value)
  1. read_config.py 和 write_config.py
    读写配置,没有特别内容

  2. QtSingleApplication.py
    封装的单例工具,它的核心作用是确保同一时间只有一个应用程序实例运行,并支持在多个实例尝试启动时,将消息传递给已经运行的实例,并激活窗口。使用QLocalSocket 作为进程间通信的工具。

class QtSingleApplication(QApplication):messageReceived = Signal(str)def __init__(self, id, *argv):super(QtSingleApplication, self).__init__(*argv)self._id = idself._activationWindow = Noneself._activateOnMessage = False# Is there another instance running?self._outSocket = QLocalSocket()self._outSocket.connectToServer(self._id)self._isRunning = self._outSocket.waitForConnected()if self._isRunning:# Yes, there is.self._outStream = QTextStream(self._outSocket)self._outStream.setCodec('UTF-8')else:# No, there isn't.self._outSocket = Noneself._outStream = Noneself._inSocket = Noneself._inStream = Noneself._server = QLocalServer()self._server.listen(self._id)self._server.newConnection.connect(self._onNewConnection)def isRunning(self):return self._isRunningdef id(self):return self._iddef activationWindow(self):return self._activationWindowdef setActivationWindow(self, activationWindow, activateOnMessage=True):self._activationWindow = activationWindowself._activateOnMessage = activateOnMessagedef activateWindow(self):if not self._activationWindow:returnself._activationWindow.setWindowState(self._activationWindow.windowState() & ~Qt.WindowMinimized)self._activationWindow.raise_()self._activationWindow.activateWindow()def sendMessage(self, msg):if not self._outStream:return Falseself._outStream << msg << '\n'self._outStream.flush()return self._outSocket.waitForBytesWritten()def _onNewConnection(self):if self._inSocket:self._inSocket.readyRead.disconnect(self._onReadyRead)self._inSocket = self._server.nextPendingConnection()if not self._inSocket:returnself._inStream = QTextStream(self._inSocket)self._inStream.setCodec('UTF-8')self._inSocket.readyRead.connect(self._onReadyRead)if self._activateOnMessage:self.activateWindow()def _onReadyRead(self):while True:msg = self._inStream.readLine()if not msg: breakself.messageReceived.emit(msg)

使用例子

def main():UUID = 'PHIR-HWOH-MEIZ-AHTA'APP = QtSingleApplication(UUID, sys.argv)if APP.isRunning():sys.exit(0)WINDOW = MyApplication()WINDOW.APP = APPAPP.setActivationWindow(WINDOW)WINDOW.show()sys.exit(APP.exec_())if __name__ == "__main__":main()

init.py

此文件为完整的应用

  • main:为启动函数

  • class HelpForm :帮助界面

  • class AboutForm :关于界面

  • class LicenseForm :版权页面
    在这里插入图片描述

  • MyApplication:为主应用

下面change_value_p 开头为 调节主屏幕
下面change_value_s 开头为 调节副屏幕

pbr 是主屏亮度,pr,pg,pb 分别代表 RGB分量
在这里插入图片描述

看看调节主屏幕代码,
在这里插入图片描述
调节色彩分量均是使用 xrandr
在这里插入图片描述

相关文章:

Brightness Controller-源码记录

Brightness Controller 亮度控制 一、概述二、ddcutil 与 xrandr1. ddcutil2. xrandr 三、部分代码解析1. icons2. ui3. utilinit.py 一、概述 项目&#xff1a;https://github.com/SunStorm2018/Brightness.git 原理&#xff1a;Brightness Controlle 是我在 Ubuntu 发现上调…...

Java8_StreamAPI

Stream 1.创建流 1.1 集合创建流 List<String> list List.of("a", "b", "c"); Stream<String> stream list.stream(); stream.forEach(System.out::println);1.2 数组创建流 String[] array {"a","b",&qu…...

【架构面试】二、消息队列和MySQL和Redis

MQ MQ消息中间件 问题引出与MQ作用 常见面试问题&#xff1a;面试官常针对项目中使用MQ技术的候选人提问&#xff0c;如如何确保消息不丢失&#xff0c;该问题可考察候选人技术能力。MQ应用场景及作用&#xff1a;以京东系统下单扣减京豆为例&#xff0c;MQ用于交易服和京豆服…...

OpenEuler学习笔记(十六):搭建postgresql高可用数据库环境

以下是在OpenEuler系统上搭建PostgreSQL高可用数据环境的一般步骤&#xff0c;通常可以使用流复制&#xff08;Streaming Replication&#xff09;或基于Patroni等工具来实现高可用&#xff0c;以下以流复制为例&#xff1a; 安装PostgreSQL 配置软件源&#xff1a;可以使用O…...

Vue.js路由管理与自定义指令深度剖析

Vue.js 是一个强大的前端框架,提供了丰富的功能来帮助开发者构建复杂的单页应用(SPA)。本文将详细介绍 Vue.js 中的自定义指令和路由管理及导航守卫。通过这些功能,你可以更好地控制视图行为和应用导航,从而提升用户体验和开发效率。 1 自定义指令详解 1.1 什么是自定义…...

skynet 源码阅读 -- 核心概念服务 skynet_context

本文从 Skynet 源码层面深入解读 服务&#xff08;Service&#xff09; 的创建流程。从最基础的概念出发&#xff0c;逐步深入 skynet_context_new 函数、相关数据结构&#xff08;skynet_context, skynet_module, message_queue 等&#xff09;&#xff0c;并通过流程图、结构…...

论文阅读(十一):基因-表型关联贝叶斯网络模型的评分、搜索和评估

1.论文链接&#xff1a;Scoring, Searching and Evaluating Bayesian Network Models of Gene-phenotype Association 摘要&#xff1a; 全基因组关联研究&#xff08;GWAS&#xff09;的到来为识别常见疾病的遗传变异&#xff08;单核苷酸多态性&#xff08;SNP&#xff09;&…...

企业微信远程一直显示正在加载

企业微信远程一直显示正在加载 1.问题描述2.问题解决 系统&#xff1a;Win10 1.问题描述 某天使用企业微信给同事进行远程协助的时候&#xff0c;发现一直卡在正在加载的页面&#xff0c;如下图所示 2.问题解决 经过一番查找资料后&#xff0c;我发现可能是2个地方出了问题…...

人工智能 - 1

深度强化学习&#xff08;Deep Reinforcement Learning&#xff09; 图神经网络&#xff08;Graph Neural Networks, GNNs&#xff09; Transformer 一种深度学习模型 大语言模型&#xff08;Large Language Models, LLMs&#xff09; 人工智能 • Marvin Minsky 将其定义…...

留学生scratch计算机haskell函数ocaml编程ruby语言prolog作业VB

您列出了一系列编程语言和技术&#xff0c;这些可能是您在留学期间需要学习或完成作业的内容。以下是对每个项目的简要说明和它们可能涉及的领域或用途&#xff1a; Scratch&#xff1a; Scratch是一种图形化编程语言&#xff0c;专为儿童和初学者设计&#xff0c;用于教授编程…...

LeetCode题练习与总结:最长和谐子序列--594

一、题目描述 和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。 给你一个整数数组 nums &#xff0c;请你在所有可能的 子序列 中找到最长的和谐子序列的长度。 数组的 子序列 是一个由数组派生出来的序列&#xff0c;它可以通过删除一些元素或不删除元素…...

Linux_线程同步生产者消费者模型

同步的相关概念 同步&#xff1a;在保证数据安全的前提下&#xff0c;让线程能够按照某种特定的顺序访问临界资源&#xff0c;从而有效避免饥饿问题&#xff0c;叫做同步竞态条件&#xff1a;因为时序问题&#xff0c;而导致程序异常&#xff0c;我们称之为竞态条件。 同步的…...

Github 2025-01-30 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2025-01-30统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Ollama: 本地大型语言模型设置与运行 创建周期:248 天开发语言:Go协议类型:MIT LicenseStar数量:42421 个Fork数量:2724 次关注人…...

FortiOS 存在身份验证绕过导致命令执行漏洞(CVE-2024-55591)

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

【Rust自学】17.2. 使用trait对象来存储不同值的类型

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 17.2.1. 需求 这篇文章以一个例子来介绍如何在Rust中使用trait对象来存储不同值的类型。 …...

毛选原文-实践论

实践论 论认识和实践的关系——知和行的关系 &#xff08;一九三七年七月&#xff09; 马克思以前的唯物论&#xff0c;离开人的社会性&#xff0c;离开人的历史发展&#xff0c;去观察认识问题&#xff0c;因此不能了解认识对社会实践的依赖关系&#xff0c;即认识对生产…...

PPT自动化 python-pptx -7: 占位符(placeholder)

占位符&#xff08;placeholder&#xff09;是演示文稿中用于容纳内容的预格式化容器。它们通过让模板设计者定义格式选项&#xff0c;简化了创建视觉一致幻灯片的过程&#xff0c;同时让最终用户专注于添加内容。这加快了演示文稿的开发速度&#xff0c;并确保幻灯片之间的外观…...

VLLM性能调优

1. 抢占 显存不够的时候&#xff0c;某些request会被抢占。其KV cache被清除&#xff0c;腾退给其他request&#xff0c;下次调度到它&#xff0c;重新计算KV cache。 报这条消息&#xff0c;说明已被抢占&#xff1a; WARNING 05-09 00:49:33 scheduler.py:1057 Sequence gr…...

Java线程认识和Object的一些方法

本文目标&#xff1a; 要对Java线程有整体了解&#xff0c;深入认识到里面的一些方法和Object对象方法的区别。认识到Java对象的ObjectMonitor&#xff0c;这有助于后面的Synchronized和锁的认识。利用Synchronized wait/notify 完成一道经典的多线程题目&#xff1a;实现ABC…...

数据库管理-第287期 Oracle DB 23.7新特性一览(20250124)

数据库管理287期 2025-01-24 数据库管理-第287期 Oracle DB 23.7新特性一览&#xff08;20250124&#xff09;1 AI向量搜索&#xff1a;算术和聚合运算2 更改Compatible至23.6.0&#xff0c;以使用23.6或更高版本中的新AI向量搜索功能3 Cloud Developer包4 DBMS_DEVELOPER.GET_…...

LruCache实现

LRU最近最少使用算法 一、LRU算法 1.简介 LRU&#xff08;Least Recently Used&#xff0c;最近最少使用&#xff09;算法是一种常用的缓存淘汰策略&#xff0c;当缓存达到其容量上限时&#xff0c;它会移除那些最久没有被访问的数据项。这种策略基于这样一个假设&#xff1…...

DDD架构实战第五讲总结:将领域模型转化为代码

云架构师系列课程之DDD架构实战第五讲总结:将领域模型转化为代码 一、引言 在前几讲中,我们讨论了领域模型的重要性及其在业务分析中的渐进获得方法。本讲将聚焦于如何将领域模型转化为代码,使得开发人员能够更轻松地实现用户的领域模型。 二、从模型到代码:领域驱动设计…...

【MySQL】MySQL客户端连接用 localhost和127.0.0.1的区别

# systemctl status mysqld # ss -tan | grep 3306 # mysql -V localhost与127.0.0.1的区别是什么&#xff1f; 相信有人会说是本地IP&#xff0c;曾有人说&#xff0c;用127.0.0.1比localhost好&#xff0c;可以减少一次解析。 看来这个入门问题还有人不清楚&#xff0c;其实…...

蓝桥杯例题五

无论你面对多大的困难和挑战&#xff0c;都要保持坚定的信念和积极的态度。相信自己的能力和潜力&#xff0c;努力不懈地追求自己的目标和梦想。不要害怕失败&#xff0c;因为失败是成功的垫脚石。相信自己的选择和决策&#xff0c;不要被他人的意见和批评左右。坚持不懈地努力…...

DeepSeek R1本地部署详细指南

DeepSeek R1 是由中国 AI 初创公司深度求索开发的先进推理模型&#xff0c;其性能在数学、编码和逻辑推理等任务上表现出色。在本地部署该模型可以带来更低的延迟、更高的隐私性以及对 AI 应用的更大控制权。本文将详细介绍如何在本地环境中部署 DeepSeek R1 模型。 前提条件 …...

MySQL(高级特性篇) 14 章——MySQL事务日志

事务有4种特性&#xff1a;原子性、一致性、隔离性和持久性 事务的隔离性由锁机制实现事务的原子性、一致性和持久性由事务的redo日志和undo日志来保证&#xff08;1&#xff09;REDO LOG称为重做日志&#xff0c;用来保证事务的持久性&#xff08;2&#xff09;UNDO LOG称为回…...

爬虫基础(五)爬虫基本原理

目录 一、爬虫是什么 二、爬虫过程 &#xff08;1&#xff09;获取网页 &#xff08;2&#xff09;提取信息 &#xff08;3&#xff09;保存数据 三、爬虫可爬的数据 四、爬虫问题 一、爬虫是什么 互联网&#xff0c;后面有个网字&#xff0c;我们可以把它看成一张蜘蛛网…...

【Block总结】HWD,小波下采样,适用分类、分割、目标检测等任务|即插即用

论文信息 Haar wavelet downsampling (HWD) 是一项针对语义分割的创新模块&#xff0c;旨在通过减少特征图的空间分辨率来提高深度卷积神经网络&#xff08;DCNNs&#xff09;的性能。该论文的主要贡献在于提出了一种新的下采样方法&#xff0c;能够在下采样阶段有效地减少信息…...

【解决方案】MuMu模拟器移植系统进度条卡住98%无法打开

之前在Vmware虚拟机里配置了mumu模拟器&#xff0c;现在想要移植到宿主机中 1、虚拟机中的MuMu模拟器12-1是目标系统&#xff0c;对应的目录如下 C:\Program Files\Netease\MuMu Player 12\vms\MuMuPlayer-12.0-1 2、Vmware-虚拟机-设置-选项&#xff0c;启用共享文件夹 3、复…...

力扣面试150 快乐数 循环链表找环 链表抽象 哈希

Problem: 202. 快乐数 &#x1f469;‍&#x1f3eb; 参考题解 Code public class Solution {public int squareSum(int n) {int sum 0;while(n > 0){int digit n % 10;sum digit * digit;n / 10;}return sum;}public boolean isHappy(int n) {int slow n, fast squa…...