Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python tkinter在MacOS上始终保持窗口在顶部_Python_Macos_User Interface_Tkinter_Window - Fatal编程技术网

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

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

我正在尝试创建一个屏幕“帘幕”,它会阻挡屏幕上除了鼠标光标附近的部分。 在windows上,使用
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)
,则窗口的边框应返回。