Tkinter 覆盖重定向不再接收事件绑定



我有一个色调顶级窗口,我想在没有框架或标题栏的情况下打开它,并且略微透明,然后在鼠标移动到窗口上时呈实心。 为此,我同时使用Toplevel.overrideredirect(True)Toplevel.attributes('-alpha', 0.75)。 我为此将<Enter><Leave>事件绑定到一个函数。

这些在单独尝试时都可以工作,但是当我将覆盖重定向设置为 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)

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

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

toplevel.wm_attributes('-type', 'splash')

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

最新更新