【问题标题】:tkinter keeping window on top all times on MacOStkinter 在 MacOS 上始终保持窗口位于顶部
【发布时间】:2019-09-16 00:23:21
【问题描述】:

我正在尝试创建一个屏幕“幕布”,它会挡住除鼠标光标附近以外的部分屏幕。 在 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 不会始终位于顶部。

【问题讨论】:

  • 这不是我的要求。它是 Stackoverflow 的要求:)。更短的代码更容易测试,使用 MacOS 的人可以运行它来确认所有 MacOS 上的问题。
  • 好的,一切都好。我用一些细节编辑了这个问题。

标签: python macos user-interface tkinter window


【解决方案1】:

在 Mac OS 上使用 overrideredirect(True) 会禁用很多东西,例如 bindButton 按下和一些事件,老实说,我不知道究竟是为什么。 (如果有人知道请发表评论)。至少在我的 Mac 上我有这个问题,我已经阅读并看到并非所有 Mac 用户都有这个问题。

这就是root.wm_attributes("-topmost", "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()

【讨论】:

  • 哇,它就像一个魅力!我很好奇的一件事是,据我所知,overrideredirect(False) 不是该选项的默认参数吗?因为在windows上,如果你调用False,它会显示标题栏,但奇怪的是在MacOS上它保留了True属性?
  • @Dashadower 我从事的项目只需要无边框窗口,所以我从未真正尝试过将窗口还原,但我相信update() 应该可以解决问题,但它对我不起作用。还有另一种方法可以在 Mac 上获得无边框窗口,比如 self.overrideredirect(False) 可以使用 update() 但你必须 lift() 无论如何我都不喜欢使用,但你也可以尝试这种方式。
  • 我们调用overrideredirect(True) 使窗口无边框。不是说默认值设置为False吗?
  • 默认值是None(link),但老实说,除非有人把if a == False 纠正我错了,否则我看不出None 和False 有什么区别。
  • 这在 MacOS 上是非常奇怪的行为,因为如果它按文档说明工作,如果要调用 overrideredirect(False),窗口的边框应该会恢复。
猜你喜欢
  • 2015-02-08
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
相关资源
最近更新 更多