我正在使用这样的代码创建一个全帧(无装饰)窗口(在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))
当我尝试打开文件对话框或消息框时,它们显示在完整框架窗口下方。我可以通过在打开其中一个对话框之前在主窗口上调用withdraw()来验证这一点。例如,
file = tkinter.filedialog.askopenfilename(parent=self.root) # UNDER main window
在Windows上我对此没有任何问题,仅在fedora 14和ubuntu 12.04上我注意到了它。 (我没有在Mac上测试过)。我正在将父母传递给对话,但他们似乎没有注意到。有人能帮助我理解我做错了什么吗?感谢。
答案 0 :(得分:3)
在窗口上调用.overrideredirect(1)
在Windows和X11上有不同的含义。在Windows上,它告诉操作系统禁用窗口边框的绘制。在X11上,它告诉窗口管理器完全忽略窗口。实际上,它应该在Windows上对它在X11上产生相同的效果,但事实并非如此。
调用.overrideredirect(1)
导致窗口保持在最顶层的原因是因为X11对它没有任何控制(因为窗口管理器不处理窗口的显示)。程序窗口和窗口管理器是完全独立的,因此实现标准窗口堆叠是没有意义的。
仅使用tkinter,您无法阻止此行为,因为tkinter实际上并不是问题的根源。可能有一种方法可以使用X11 Python绑定来显示没有框架的窗口,但这会产生特定于平台的代码。
您可能需要重新考虑删除窗口边框。有可能的选择吗?包含窗口边框的全屏窗口是一个很好的选择。由于可访问性原因(无法移动,最小化,最大化等),在最佳时间移除窗口边框不是一个好主意。此外,作为Linux用户,我个人的窗口边框定制了各种功能(例如窗口标签,阴影按钮),并且经常使用它们。删除窗口边框会阻止使用此类功能。