Tkinter overrideredirect 不再接收事件绑定

Cai*_*son 7 python tkinter

我有一个 tinter Toplevel 窗口,我想在没有框架或标题栏的情况下出现并且稍微透明,然后当鼠标移动到窗口上时固定。为此,我同时使用Toplevel.overrideredirect(True)Toplevel.attributes('-alpha', 0.75)。为此,我将<Enter><Leave>事件绑定到一个函数。

这些都在单独尝试时有效,但是当我将 overrideredirect 设置为 True 时,鼠标进入和离开的绑定不再有效。当我点击窗口时绑定调用,然后当我移动鼠标时,而不是当光标进入或离开窗口时。

我也尝试将这些绑定到一个框架,但没有进一步的运气。

toplevel = Toplevel(root)
toplevel.overrideredirect(True)
toplevel.attributes('-alpha', 0.75)
toplevel.bind('<Enter>', lambda x: mouseMovement(command='enter'))
toplevel.bind('<Leave>', lambda x: mouseMovement(command='leave'))
def mouseMovement(command):
    print('Callback: ' + command)
    if command == 'enter':
        toplevel.attributes('-alpha', 1)
    elif command == 'leave':
        toplevel.attributes('-alpha', 0.75)
Run Code Online (Sandbox Code Playgroud)

我曾尝试在此处使用类似问题的答案,但这会导致窗口具有所有标准的操作系统装饰,但关闭、最小化和放大按钮被简单地禁用。有没有办法可以摆脱标题栏,但仍然保留我的绑定?

pat*_*yts 3

在 X Windows 上,可以使用适当的扩展窗口管理器提示来处理此问题,以请求窗口管理器按照所需的方式装饰顶层。这听起来像是一个闪屏窗口,因此“闪屏”在这里可能是合适的。为此,请使用 wm_attributes -type参数,例如:

toplevel.wm_attributes('-type', 'splash')
Run Code Online (Sandbox Code Playgroud)

顶层将被装饰为闪屏对话框,这通常意味着没有标题栏。如果将此应用到已映射的窗口,则需要撤回并重新映射(调用 wm_deiconify)以使窗口管理器应用其新提示类型的设置。