使用tkinter制作一个名为root的gui,在root上创建一个名为top的toplevel,当我设置top弹出式,执行root.attributes('-disabled', True)来锁定root,当我关闭top后使用root.attributes('-disabled', False)来启用root,但是启用root后,root会被电脑桌面上其他软件覆盖,如果我使用root.lift()可以让root不被覆盖,但是这样root就不是focus的状态,即使添加root.focus()也不行,我需要怎么样操作可以在top关闭后root不会被其他软件覆盖同时保持focus状态
时间: 2024-02-26 10:57:09 浏览: 137
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
5星 · 资源好评率100%
你可以在top关闭后,使用`root.focus_force()`来让root重新获得焦点,这样root就会在最前面并且是focus状态。同时,你可以使用`root.lift()`将root移动到最顶层,这样就不会被其他软件覆盖了。具体实现代码如下:
```
import tkinter as tk
def disable_root():
root.attributes('-disabled', True)
top.grab_set()
def enable_root():
root.attributes('-disabled', False)
top.grab_release()
root.focus_force()
root.lift()
root = tk.Tk()
root.geometry('200x200')
top = tk.Toplevel(root)
top.geometry('100x100')
top.protocol('WM_DELETE_WINDOW', enable_root)
top.transient(root) # 设置父窗口为root
top.attributes('-toolwindow', True) # 设置为弹出式窗口
top.bind('<FocusIn>', lambda e: disable_root())
top.bind('<FocusOut>', lambda e: enable_root())
btn = tk.Button(root, text='弹出top', command=top.deiconify)
btn.pack()
root.mainloop()
```
在上面的代码中,我们使用`grab_set()`方法来锁定top,这样就可以防止用户在top关闭前操作root,同时也会让root失去focus状态。而在关闭top后,我们使用`grab_release()`方法来释放top对root的锁定,然后使用`focus_force()`方法来让root重新获得焦点。最后,我们使用`lift()`方法将root移动到最上层。
阅读全文