【问题标题】:Detect OS dark mode in Python在 Python 中检测 OS 暗模式
【发布时间】:2021-03-25 10:40:42
【问题描述】:

我正在用 python 编写一个带有 GUI 的小程序,我正在使用 tkinter。我想做的是为我的程序添加暗模式支持。 Mac OS、Ubuntu(至少是 Gnome)和 Windows 10 都有系统范围的“深色模式”设置,这将使所有程序自动以深色主题运行。

但是我如何检查这些设置(理想情况下,独立于操作系统),以便我的程序知道它是否需要渲染亮模式或暗模式?我找到了一堆像 darkdetect 这样的库,它们可以为 MacOS 处理这个问题,但我没有找到任何适用于 Ubuntu 和 Windows 10 的库。

我知道我可以使用 ttkthemes 之类的东西为我的程序创建深色主题设计,但我怎么知道何时启用它?在 Windows 10 或 Ubuntu 20.04 上运行的 python 脚本如何判断用户是否在操作系统设置中启用了暗模式?

理想情况下,我正在寻找适用于所有三个操作系统的解决方案/代码,但如果这不可能(我怀疑)依赖于操作系统的代码也可以。我只是在任何地方都找不到适合非 MacOS 系统的示例。

【问题讨论】:

  • darkdetect 也适用于 Windows。

标签: python user-interface tkinter


【解决方案1】:

在 macOS 上,会出现暗/亮模式,可以通过在终端上运行简单的命令 defaults read -g AppleInterfaceStyle 来检查。

  • 在暗模式下,命令返回

    Dark
    

    它只会返回 Dark,意思是 AppleInterfaceStyle 存在。

  • 在 Light 模式下返回相同的命令

    2020-12-18 17:44:21.870 defaults[20253:5665627] 
    The domain/default pair of (kCFPreferencesAnyApplication, AppleInterfaceStyle) does not exist
    

    默认情况下启用灯光模式,因此AppleInterfaceStyle 不存在,这就是它返回错误的原因。


我们可以简单地创建一个函数,该函数将在启用暗模式时返回True,如果启用亮模式则返回False

import subprocess

def check_appearance():
    """Checks DARK/LIGHT mode of macos."""
    cmd = 'defaults read -g AppleInterfaceStyle'
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE, shell=True)
    return bool(p.communicate()[0])

【讨论】:

  • 不是Mac OS的问题吗?
  • @MaximilianPeters:是的,我只回答了这个问题,因为我认为无需安装任何外部库,只需几行代码即可完成。我只是在传播我的知识,这可以帮助他。
【解决方案2】:

Windows 10 快速解答

def detect_darkmode_in_windows(): 
    try:
        import winreg
    except ImportError:
        return False
    registry = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER)
    reg_keypath = r'SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize'
    try:
        reg_key = winreg.OpenKey(registry, reg_keypath)
    except FileNotFoundError:
        return False

    for i in range(1024):
        try:
            value_name, value, _ = winreg.EnumValue(reg_key, i)
            if value_name == 'AppsUseLightTheme':
                return value == 0
        except OSError:
            break
    return False
  • 它会检查winreg 是否可以导入,如果不是,您可能没有使用 Windows
  • 搜索相关的注册表项,如果没有找到,则认为没有开启暗模式
  • 如果注册表项存在且值设置为 0,则设置暗模式

【讨论】:

    【解决方案3】:

    在 Gnome 上,暗模式开关取决于主题。以下功能应适用于 Ubuntu 20.04 中的默认主题:

    import subprocess
    
    
    def detectDarkModeGnome():
        '''Detects dark mode in GNOME'''
        getArgs = ['gsettings', 'get', 'org.gnome.desktop.interface', 'gtk-theme']
    
        currentTheme = subprocess.run(
            getArgs, capture_output=True
        ).stdout.decode("utf-8").strip().strip("'")
    
        darkIndicator = '-dark'
        if currentTheme.endswith(darkIndicator):
            return True
        return False
    
    

    【讨论】:

      【解决方案4】:

      我打算创建自己的通用函数,但看起来有人已经为所有操作系统制作了一个不错的包:https://pypi.org/project/darkdetect/

      import darkdetect
      
      darkdetect.theme()
      # Returns 'Dark'
      
      darkdetect.isDark()
      # Returns True
      
      darkdetect.isLight()
      # Returns False
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-02
        • 2021-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-09
        • 2016-09-03
        • 2020-01-28
        相关资源
        最近更新 更多