在MacOS上,tkinter始终保持最佳状态

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在MacOS上,tkinter始终保持最佳状态相关的知识,希望对你有一定的参考价值。

我正在尝试创建一个屏幕“窗帘”,除了鼠标光标的附近区域外,它会阻挡部分屏幕。在Windows上,使用root.wm_attributes("-topmost", "true")保持窗口在顶部,即使我专注于另一个应用程序,完美。但是,在MacOS上运行代码时,如果窗口的焦点丢失,它将不会保持在最顶层。什么是MacOS相当于-topmost窗口管理器属性,它将始终保持窗口在顶部,无论焦点?

import tkinter as tk

class TransparentWindow(tk.Toplevel):
    """
    This class is just a Toplevel window.
    """
    def __init__(self, background="white", opacity=0.7):
        super(TransparentWindow, self).__init__()
        #self.master = master
        self.configure(background=background)
        self.overrideredirect(True)
        self.wm_attributes("-alpha", opacity)
        self.wm_attributes("-topmost", "true")
        self.lift()


if __name__ == '__main__':
    root = tk.Tk()
    TransparentWindow() 
    root.mainloop()

在High Sierra虚拟机中运行此代码导致Toplevel在选择另一个窗口时不会始终位于顶部。

答案

在Mac OS上使用overrideredirect(True)禁用很多东西,如bindButton印刷机和一些事件,说实话,我不知道为什么。 (如果有人知道请评论)。至少在我的Mac上我有这个问题,我已经阅读并看到并非所有的Mac用户都有这个问题。

所以这就是root.wm_attributes("-topmost", "true")无法正常工作的原因。但不要担心我有一个解决方法。

Here is your example which works exactly you want on my Mac.

从你的代码我可以告诉你,你想要一个无边框窗口,这是我如何做所有绑定和事件仍然工作。

我首先把overrideredirect(True)放在下一行overrideredirect(False)在这种情况下你也不需要root.lift()

好的,试试这个代码,看看按钮是否正常按下。

样品

import tkinter as tk

root = tk.Tk()

root.overrideredirect(True)
# root.overrideredirect(False)  # Uncomment and try again.

tk.Button(root, text="Borderless").pack()
root.wm_attributes("-topmost", "true")
root.wm_attributes("-alpha", 0.7)
root.wm_attributes("-topmost", "true")

# Doesn't matter if you use lift() or not with the use of root.overrideredirect(False) as well
root.lift()                     

root.mainloop()

我希望这对你有所帮助。


这是您的代码,它完全符合您的要求(至少在我的Mac上)。

import tkinter as tk

class TransparentWindow(tk.Toplevel):
    """
    This class is just a Toplevel window.
    """
    def __init__(self, background="white", opacity=0.7):
        super(TransparentWindow, self).__init__()
        #self.master = master
        self.configure(background=background)
        self.overrideredirect(True)
        self.overrideredirect(False)
        self.wm_attributes("-alpha", opacity)
        self.wm_attributes("-topmost", "true")
        # self.lift()

if __name__ == '__main__':
    root = tk.Tk()
    TransparentWindow() 
    root.mainloop()

以上是关于在MacOS上,tkinter始终保持最佳状态的主要内容,如果未能解决你的问题,请参考以下文章

如何让Android模拟器始终在macOS中保持领先

在 macOS 上播放声音

无法在 MacOS 上使用 pyenv Python 安装 tkinter

在 Mac OS 上设置 tkinter 图标

数据库连接应该始终保持打开状态还是仅在需要时才打开?

让 tkinter 在带有 asdf 的 macos 上使用 python 3.x