6

I am creating a full-frame (no decorations) window with code like this (in python 3.2 using 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))

When I try to open a file dialog or message box, they appear UNDER the full frame window. I can verify this by calling a withdraw() on the main window before I open one of the dialogs. For example,

   file = tkinter.filedialog.askopenfilename(parent=self.root) # UNDER main window

On windows I don't have a problem with this, only on fedora 14 and ubuntu 12.04 have I noticed it. (I haven't tested on Mac). I'm passing a parent to the dialogs but they don't seem to be paying attention. Can someone help me understand what I'm doing wrong? Thanks.

4

1 回答 1

3

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

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

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

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

于 2012-08-18T01:29:08.977 回答