我正在尝试创建一个屏幕“窗帘”,该屏幕会阻塞除鼠标光标附近以外的屏幕的其他部分。
在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不会一直处于顶部。
答案 0 :(得分:1)
在Mac OS上,使用overrideredirect(True)
会禁用bind
,Button
印刷机和某些事件之类的许多功能,说实话我不知道为什么会这样。 (如果有人知道,请发表评论)。至少在我的Mac上,我有此问题,我已经阅读并看到并非所有Mac用户都遇到此问题。
这就是root.wm_attributes("-topmost", "true")
无法正常工作的原因。但是不用担心我有解决方法。
从您的代码中可以看出您想要一个 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()