Python tkinter在MacOS上始终保持窗口在顶部
我正在尝试创建一个屏幕“帘幕”,它会阻挡屏幕上除了鼠标光标附近的部分。 在windows上,使用Python tkinter在MacOS上始终保持窗口在顶部,python,macos,user-interface,tkinter,window,Python,Macos,User Interface,Tkinter,Window,我正在尝试创建一个屏幕“帘幕”,它会阻挡屏幕上除了鼠标光标附近的部分。 在windows上,使用root.wm_属性(“-topmost”,“true”)将窗口保持在顶部,即使我专注于另一个应用程序,这也是完美的。但是,在MacOS上运行代码时,如果窗口的焦点丢失,它将不会保持在最顶端。 MacOS相当于最顶层的窗口管理器属性是什么?它将始终保持窗口在顶部,而不管焦点是什么 import tkinter as tk class TransparentWindow(tk.Toplevel):
root.wm_属性(“-topmost”,“true”)
将窗口保持在顶部,即使我专注于另一个应用程序,这也是完美的。但是,在MacOS上运行代码时,如果窗口的焦点丢失,它将不会保持在最顶端。
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不会一直处于顶部。在Mac OS上使用
OverrideDirect(True)
会禁用很多东西,如bind
,按钮按下和一些事件,老实说,我不知道确切原因。(如果有人知道,请评论)。至少在我的Mac电脑上,我有这个问题,我读过并看到并非所有的Mac用户都有这个问题
这就是为什么root.wm_属性(“-topmest”,“true”)
不起作用的原因。但别担心,我有办法解决
从您的代码中,我可以看出您想要一个无边界的窗口,下面是我如何在所有绑定和事件仍在工作的情况下实现它的
我首先将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()
这不是我的要求。It i堆栈溢出要求:)。较短的代码更容易测试,使用MacOS的人可以运行它来确认所有MacOS上的问题。好的,很好。我用一些细节编辑了这个问题。哇,它很有魅力!有一件事我很好奇,就我所知,overrideredirect(False)
不是该选项的默认参数吗?因为在windows上,如果调用False
,它将显示标题栏,但奇怪的是,在MacOS上它保留了True
属性?@Dashadower我处理的项目只需要一个无边界窗口,所以我从未真正尝试还原窗口,但我相信update()
应该可以,但对我不起作用。还有另一种方法可以在Mac上获得无边界窗口,比如,而不是self。OverrideDirect(False)
可以使用update()
,但是你必须使用lift()
,我不喜欢使用它,但是你也可以尝试这种方法。我们调用OverrideDirect(True)
来实现窗口无边界。这是否意味着默认值设置为False
?默认值为None
,但老实说,我看不出None和False有多大区别,除非有人把如果a==False
纠正我的错误。这在MacOS上是一种非常奇怪的行为,因为如果它按照文档的方式工作,如果要调用overrideredirect(False)
,则窗口的边框应返回。