tkinter在MacOS上始终将窗口保持在顶部

时间:2019-04-26 13:13:57

标签: python macos user-interface tkinter window

我正在尝试创建一个屏幕“窗帘”,该屏幕会阻塞除鼠标光标附近以外的屏幕的其他部分。 在Windows上,即使我专注于另一个应用程序,使用root.wm_attributes("-topmost", "true")也可以使窗口始终位于顶部。但是,在MacOS上运行代码时,如果窗口焦点丢失了,它将无法保持其自身的最高位置。 与-topmost窗口管理器属性等效的MacOS是什么,无论焦点如何,该属性始终将窗口保持在顶部?

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不会一直处于顶部。

1 个答案:

答案 0 :(得分:1)

在Mac OS上,使用overrideredirect(True)会禁用bindButton印刷机和某些事件之类的许多功能,说实话我不知道为什么会这样。 (如果有人知道,请发表评论)。至少在我的Mac上,我有此问题,我已经阅读并看到并非所有Mac用户都遇到此问题。

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

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

从您的代码中可以看出您想要一个 borderless 窗口,这是在所有绑定和事件仍能正常工作的情况下执行的操作。

  

我首先将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()
相关问题