如何在 Mac OS 上使用 Tkinter 获取黑色文件对话框?

Posted

技术标签:

【中文标题】如何在 Mac OS 上使用 Tkinter 获取黑色文件对话框?【英文标题】:How to get a black file dialog box using Tkinter on Mac OS? 【发布时间】:2019-08-24 07:04:54 【问题描述】:

我正在尝试实现一个黑色文件对话框(Mac OS 暗模式)。我正在使用 Tkinter 文件对话框模块 (import tkinter.filedialog)。

Mojave (10.14.4) 暗模式 Python 3.6.8 Tcl/Tk 8.6.8

当我从任何其他应用程序打开文件对话框时,它们具有黑色背景,但当我从 tkinter.filedailog 打开它时,它们具有默认的白色背景。

这是Tkinter打开的文件对话框的图片:

从其他地方打开时,Mojave 暗模式支持的黑色文件对话框:


如果有什么方法可以得到Tkinter的黑色文件对话框,请帮帮我,我真的想要黑色对话框。

sample.py

import tkinter.filedialog as _FD

_Master = _FD.Tk()
_Master.withdraw()

from kivy.core.window import Window as _kivy_window

class Open(_FD.Open):
    def __init__(self, multiple=False, **options): 
        if multiple: options["multiple"]=1
        super(Open, self).__init__(**options)

    def show(self, **options):
        s = super().show(**options)
        _kivy_window.raise_window()
        return s

if __name__ == "__main__":

    from kivy.app import App
    from kivy.uix.button import Button
    _kivy_window.size = (250, 250)

    class TestApp(App):
        def open(self, *a):
            s = Open(multiple=True)
            s = s.show()
            if s: print(s)

        def build(self):
            return Button(text='Hello World', on_release=self.open)

    TestApp().run()

【问题讨论】:

【参考方案1】:

可能导致您无法在 Tkinter GUI 上获得适当的暗模式支持的问题。所有这些都在我的 Mac 上,每个系统都可能不同。

第 1 步:首先你需要对那些官方不支持暗模式的应用强制使用暗模式。

默认情况下,暗模式并不适用于每个应用程序,例如某些第三方应用程序和来自不受信任的开发人员的应用程序。 我们仍然可以为这些应用程序实现暗模式,但并不是每个应用程序都能正常工作,这可能就是为什么它不是设置中的选项。

如果您对使用命令行没有信心,您可能不应该这样做。

    启用暗模式,然后在终端中运行此命令:

     defaults write -g NSRequiresAquaSystemAppearance -bool No
    

    注意:“是”表示禁用所有窗口,“否”表示启用所有窗口。

    运行命令后注销并重新登录以注意更改。

如果您想恢复默认设置,只需使用以下命令删除NSRequiresAquaSystemAppearance 设置。

defaults delete -g NSRequiresAquaSystemAppearance

第 2 步:如何修复黑色 Tkinter 窗口?

对于蟒蛇

如果您使用 Anaconda,那么您只需执行第一步以在所有应用程序上获取暗模式,然后从命令行将 Tcl/Tk 更新到 8.6.9。 (More Details)

conda install -c conda-forge tk 
conda install -c conda-forge/label/gcc7 tk 
conda install -c conda-forge/label/broken tk 
conda install -c conda-forge/label/cf201901 tk

结果

更新:

Anaconda 已将 Tcl/Tk 更新至 8.6.10 并添加了一个新命令,支持 macOS 的不同外观模式 (dark, light),这意味着更改任何模式都会更改背景颜色窗口和小部件也是如此,但它有点小故障。我们还必须通过foreground = 'black 才能看到Button 的文本以及其他一些小部件。

conda install -c conda-forge/label/cf202003 tk

Python.org

解决第一个问题后,如果您有 Tcl/Tk 8.6.8,您将在 Tkinter 上获得暗模式,但在 Tkinter 窗口上会出现黑屏。

示例图片

这个问题已经在 Tcl/Tk 8.6.9 中得到解决,但是由于 python.org 没有更新它并且还提供了他们自己的 Tcl/Tk 8.6.8 的私有副本。他们不寻找或使用 Tcl/Tk(More Details) 的任何第三方或系统副本。因此,如果您想从第三方安装它,那将是浪费时间。

我测试了Python 3.7.2rc1,它是内置的 Tcl/Tk 8.6.9,它在 Mojave 暗模式下运行良好,但由于在 Tk 8.6.9.1 中发现了一些回归,他们恢复了已发布的 python.org 3.7.2 macOS安装程序回到 Tcl/Tk 8.6.8。

示例图片

【讨论】:

tkmacosx 按钮在暗模式下工作【参考方案2】:

我不是 GUI 开发人员,但我很确定 OSX 不会让您更改实体(例如对话框窗口)的颜色...

如果有帮助,我运行您的代码并得到以下结果:

虽然我使用的是 OSX 暗模式...

【讨论】:

当我运行我的代码时,我得到一个白色对话框,我也在使用 OSX 暗模式。你能解释一下你是怎么做对的吗? 我发现了问题,但不确定解决方案是什么。问题是我正在使用 python 3.6.7,它使用 tcl 8.6.8 和 tk 8.6.8,它不支持 macos 的暗模式,但如果你的 python 版本低于 3.6.5,那么它使用 tcl 8.5,它确实有效使用 Mojave 黑暗模式。感谢您的帮助,谢谢! 很确定我使用的是 3.7.2 我可能完全错了,但这是***.com/questions/52929744/…的帖子。

以上是关于如何在 Mac OS 上使用 Tkinter 获取黑色文件对话框?的主要内容,如果未能解决你的问题,请参考以下文章

在 Mac OS 上设置 tkinter 图标

使用 Tkinter 和 Python 在 Mac OS X 中进行惯性滚动

Tkinter 窗口专注于 Mac OS X

#yyds干货盘点# 如何优雅的获取 Mac OS 系统 IP 地址?

如何优雅的获取 Mac OS 系统 IP 地址?

如何在 Mac OS X 上获取拖放到应用程序二进制文件中的文件列表? [关闭]