Tkinter overrideredirect 不再接收事件绑定

Posted

技术标签:

【中文标题】Tkinter overrideredirect 不再接收事件绑定【英文标题】:Tkinter overrideredirect no longer receiving event bindings 【发布时间】:2014-01-10 10:28:59 【问题描述】:

我有一个着色的顶层窗口,我想在没有框架或标题栏的情况下显示它,并且稍微透明,然后当鼠标在窗口上移动时变为实心。为此,我同时使用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)

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

【问题讨论】:

只是对你的代码风格的评论:当commandmouseMovement 的位置参数时,你怎么会lambda x: mouseMovement(command='enter')?执行lambda x: mouseMovement('enter') 就可以了。 这就是我喜欢的写法。我认为它根本不会影响代码。 不,它没有。我只是好奇。 在没有command= 的情况下使用位置参数对我来说会更pythonic吗? 什么平台?这是在 OSX 上吗? 【参考方案1】:

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

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

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

【讨论】:

以上是关于Tkinter overrideredirect 不再接收事件绑定的主要内容,如果未能解决你的问题,请参考以下文章

在 Tkinter 上显示全屏模式

帮助 Tkinter Alpha

标签调整错误tkinter

使 Tkinter 窗口显示在任务栏中

Tkinter 窗口属性设置

Tkinter,Windows:如何在没有标题栏的 Windows 任务栏中查看窗口?