tkinter 在 MacOS 上始终保持 window 在顶部

tkinter keeping window on top all times on MacOS

我正在尝试创建一个屏幕 "curtain",它会遮挡除鼠标光标附近以外的部分屏幕。 在 windows 上,使用 root.wm_attributes("-topmost", "true") 可以将 window 保持在最前面,即使我专注于另一个应用程序也是如此。但是,在 运行 MacOS 上的代码中,如果 window 的焦点丢失,它将不会保持在最顶层。 什么是 MacOS 等效于 -topmost window 管理器属性,无论焦点如何,它总是将 window 保持在顶部?

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 虚拟机中的此代码导致在选择另一个 window 时 Toplevel 不会始终位于顶部。

在 Mac OS 上使用 overrideredirect(True) 会禁用很多东西,例如 bindButton 按下和一些事件,老实说我不知道为什么。 (有知道的请留言)。至少在我的 Mac 上我有这个问题,我已经阅读并看到并非所有 Mac 用户都有这个问题。

所以这就是 root.wm_attributes("-topmost", "true") 不起作用的原因。但别担心,我有解决方法。

从你的代码我可以看出你想要一个无边界window,下面是我在所有绑定和事件仍然有效的情况下的做法。

I first put overrideredirect(True) then in the next line overrideredirect(False) Also you don't need root.lift() in this case.

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

示例

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()