Tkinter overrideredirect不再接收事件绑定

时间:2013-12-21 19:17:20

标签: python tkinter

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

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

我也尝试将这些绑定到一个Frame,但没有更多的运气。

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)

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

1 个答案:

答案 0 :(得分:0)

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

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

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