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 的答案,但这会导致窗口具有所有标准操作系统装饰,但关闭、最小化和放大按钮被禁用。有没有办法让我摆脱标题栏,但仍然保留我的绑定?
【问题讨论】:
只是对你的代码风格的评论:当command
是mouseMovement
的位置参数时,你怎么会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 不再接收事件绑定的主要内容,如果未能解决你的问题,请参考以下文章