【问题标题】:python tkinter full frame vs message box focuspython tkinter 全帧 vs 消息框焦点
【发布时间】:2012-08-14 06:59:31
【问题描述】:

我正在使用这样的代码创建一个全帧(无装饰)窗口(在 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 上测试过)。我将父母传递给对话框,但他们似乎没有注意。有人可以帮我理解我做错了什么吗?谢谢。

【问题讨论】:

    标签: python focus tkinter python-3.2


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 怀着一颗悲伤的心,无法确认或否认你的答案,我将其标记为正确。
    猜你喜欢
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 2021-04-15
    相关资源
    最近更新 更多