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)
会禁用很多东西,例如 bind
、Button
按下和一些事件,老实说我不知道为什么。 (有知道的请留言)。至少在我的 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()
我正在尝试创建一个屏幕 "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)
会禁用很多东西,例如 bind
、Button
按下和一些事件,老实说我不知道为什么。 (有知道的请留言)。至少在我的 Mac 上我有这个问题,我已经阅读并看到并非所有 Mac 用户都有这个问题。
所以这就是 root.wm_attributes("-topmost", "true")
不起作用的原因。但别担心,我有解决方法。
从你的代码我可以看出你想要一个无边界window,下面是我在所有绑定和事件仍然有效的情况下的做法。
I first put
overrideredirect(True)
then in the next lineoverrideredirect(False)
Also you don't needroot.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()