如何使用Python在Windows中更改屏幕亮度?

3
我该如何使用Python在Windows中更改屏幕亮度,而不需要任何额外的Python包? 我还希望找到一种方法来获取当前屏幕亮度。 我认为需要使用ctypes,但我找不到任何有关如何实现的信息。
我很烦恼Windows上的屏幕亮度按钮会以非常大的增量调整屏幕亮度,因此我创建了一个Python tkinter程序,在任务栏上显示当前屏幕亮度,当我在tkinter窗口上滚动鼠标滚轮时,它会更改屏幕亮度:
import subprocess
from tkinter import Canvas, Tk

win = Tk()
win.overrideredirect(True)

canvas = Canvas(win, bg = "#101010", highlightthickness = 0)
canvas.pack(fill = "both", expand = True)

def trim(string, l = None, r = None, include = False, flip = False):
    string = str(string)
    if l and l in string:
        string = string[(string.rindex(l) if flip else string.index(l)) + (0 if include else len(l)):]
    if r and r in string:
        string = string[:(string.index(r) if flip else string.rindex(r)) + (len(r) if include else 0)]
    return string

def set_screen_brightness():
    subprocess.run(
        ["powershell",
         f"(Get-WmiObject -Namespace root/WMI -Class WmiMonitorBrightnessMethods).WmiSetBrightness(1,{current_brightness})"],
        stdout = subprocess.PIPE, stderr = subprocess.STDOUT, shell = True)

def get_screen_brightness():
    value = subprocess.check_output(
        ["powershell", f"Get-Ciminstance -Namespace root/WMI -ClassName WmiMonitorBrightness"],
        shell = True)
    return int(trim(value, l = "CurrentBrightness : ", r = r"\r\nInstanceName      : "))

current_brightness = get_screen_brightness()

brightness_text = canvas.create_text(30, 25, text = current_brightness,
                                         font = ("Segue ui", 14, "bold"), fill = "White", anchor = "w")

sw, sh = win.winfo_screenwidth(), win.winfo_screenheight()
win.geometry(f"69x50+{sw - 505}+{sh - 49}")

def mouse_wheel_screen_brightness(scroll):
    global current_brightness, mouse_wheel_screen_brightness_wa
    if "mouse_wheel_screen_brightness_wa" in globals():
        win.after_cancel(mouse_wheel_screen_brightness_wa)

    current_brightness += 2 if scroll else -2
    if current_brightness < 0: current_brightness = 0
    if current_brightness > 100: current_brightness = 100
    canvas.itemconfig(brightness_text, text = current_brightness)

    mouse_wheel_screen_brightness_wa = win.after(100, lambda: set_screen_brightness())

win.bind("<MouseWheel>", lambda e: mouse_wheel_screen_brightness(e.delta > 0))

def topmost():
    win.attributes("-topmost", True)
    win.after(100, topmost)
topmost()

win.mainloop()

我相信在ctypes中有一种快速改变屏幕亮度的方法,而不需要任何额外的Python包。使用子进程调用Powershell时,屏幕亮度文本会冻结。 我想不使用任何额外的Python包来完成这个任务,因为当我尝试安装Python包时,它会显示确认SSL证书时遇到了问题。我搜索了一下并尝试修复它,但是我无法让它正常工作。

4个回答

2

使用pip安装屏幕亮度控制

Windows: pip install screen-brightness-control

Mac/Linux: pip3 install screen-brightness-control 我猜

然后使用这段代码

import screen_brightness_control as sbc

sbc.set_brightness(25) # Number will be any number between 0 and hundred
# Sets screen brightness to 25%

我在屏幕亮度模块这里找到了信息。


我说过我想只使用Python标准库来完成它。编辑后更清晰地表明我想在不使用任何额外的Python包的情况下完成它。 - Bevis Hobbs

2
另一种在不使用任何库的情况下完成此操作的方法是:
import subprocess


def run(cmd):
    completed = subprocess.run(["powershell", "-Command", cmd], capture_output=True)
    return completed

if __name__ == '__main__':
    take_brightness = input("Please enter the brightness level: ")
    command = "(Get-WmiObject -Namespace root/WMI -Class WmiMonitorBrightnessMethods).WmiSetBrightness(1," + take_brightness + ")"
    hello_command = f"Write-Host {command}"
    hello_info = run(hello_command)

你得到答案了吗?如果是的话,请点赞并接受答案。 - CodeWithYash
这个问题在于它非常慢,我相信使用ctypes一定有更快的方法来解决它,而不需要任何额外的Python包。 - Bevis Hobbs
我不认为它很慢。在我的情况下,它运行得非常好。 - CodeWithYash
我已编辑我的问题,解释说通过调用PowerShell的子进程,在tkinter窗口中的屏幕亮度文本会保持冻结。非常抱歉在提问时没有解释清楚我的做法。 - Bevis Hobbs

1
通过使用 PowerShell 命令,我们可以轻松地增加或减少 Windows 的亮度,无需任何外部软件包。
WmiSetBrightness(1,<brightness % goes here>)


import subprocess

subprocess.run(["powershell", "(Get-WmiObject -Namespace root/WMI -Class WmiMonitorBrightnessMethods).WmiSetBrightness(1,40)"])

Subprocess是Python内置的库。

只需运行以上代码,希望这能起作用。


这个问题在于它很慢,我相信使用ctypes一定有更快的方法来解决它,而且不需要任何额外的Python包。 - Bevis Hobbs
我已经编辑了我的问题,解释说使用调用PowerShell的子进程时,tkinter窗口中的屏幕亮度文本会保持冻结。非常抱歉我在提问时没有解释我在做什么。 - Bevis Hobbs

1

我使用了WMI库,它确实很好用。这是代码,但是它只适用于Windows操作系统。我认为它是特定于操作系统的,所以如果它对你不起作用,你应该寻找更好的解决方案。

import wmi
    
brightness = 40 # percentage [0-100] For changing thee screen 
c = wmi.WMI(namespace='wmi')
methods = c.WmiMonitorBrightnessMethods()[0]    
methods.WmiSetBrightness(brightness, 0)

如果您喜欢这个答案,请点赞并接受它。

如果您喜欢这个答案,请点赞并接受它。 - CodeWithYash
我说过我想不使用任何额外的Python包来完成它。 - Bevis Hobbs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接