python tkinter全帧与消息框焦点

May*_*tel 6 python focus tkinter python-3.2

我正在使用这样的代码创建一个全帧(无装饰)窗口(在python 3.2中使用tkinter):

self.root = Tk()    
self.W, self.H = self.root.winfo_screenwidth(), self.root.winfo_screenheight()
self.root.overrideredirect(1) # full screen, no menu or borders
self.root.geometry("%dx%d+0+0" % (self.W, self.H))
Run Code Online (Sandbox Code Playgroud)

当我尝试打开文件对话框或消息框时,它们显示在完整的框架窗口下.在打开其中一个对话框之前,我可以通过在主窗口上调用withdraw()来验证这一点.例如,

   file = tkinter.filedialog.askopenfilename(parent=self.root) # UNDER main window
Run Code Online (Sandbox Code Playgroud)

在Windows上我没有这个问题,只有在fedora 14和ubuntu 12.04上我才注意到它.(我没有在Mac上测试过).我正在将父母传递给对话,但他们似乎没有注意到.有人能帮助我理解我做错了什么吗?谢谢.

D K*_*D K 3

在 Windows 和 X11 上调用.overrideredirect(1)窗口具有不同的含义。在 Windows 上,它告诉操作系统禁用窗口边框的绘制。在 X11 上,它告诉窗口管理器完全忽略该窗口。实际上,它在 Windows 上应该具有与 X11 上相同的效果,但事实并非如此。

调用导致窗口停留在顶部的原因.overrideredirect(1)是因为X11对其没有任何控制权(因为窗口的显示不是由窗口管理器处理的)。程序窗口和窗口管理器是完全独立的,因此实现标准窗口堆叠没有意义。

仅使用 tkinter,您无法采取任何措施来防止这种行为,因为 tkinter 并不是真正的问题根源。可能有一种方法可以使用 X11 Python 绑定来显示没有框架的窗口,但这会导致特定于平台的代码。

您可能需要重新考虑删除窗口边框。有可能的替代方案吗?包含窗口边框的全屏窗口是一个不错的选择。由于可访问性原因(无法移动、最小化、最大化等),即使在最好的情况下,删除窗口边框也不是一个好主意。另外,就我个人而言,作为一名 Linux 用户,我使用各种功能(例如窗口选项卡、阴影按钮)自定义了窗口边框,并且非常频繁地使用它们。删除窗口边框将阻止使用此类功能。