【问题标题】:WxPython - How to hide the X and expand button on windowWxPython - 如何隐藏窗口上的 X 和展开按钮
【发布时间】:2014-07-29 20:13:53
【问题描述】:

我正在制作一个 python 程序,并且在某些功能中它需要隐藏 X 和展开窗口按钮,我该怎么做?我用的是 WxPython,我怎么把它放进去?

【问题讨论】:

  • 您想要一个普通的框架,并以编程方式隐藏关闭和缩放按钮,还是只想创建没有这些按钮的框架? (第二个更容易——而且跨平台也可能更有意义。)
  • @abarnet 我希望能够创建没有这些按钮的框架

标签: python windows python-2.7 wxpython


【解决方案1】:

窗口框架中的小部件被定义为窗口样式的一部分:CLOSE_BOXMINIMIZE_BOXMAXIMIZE_BOX

因此,当您创建窗口时,只需将这些样式排除在外。

如果您使用的是wx.Frame 子类,请注意DEFAULT_FRAME_STYLE 包含这些值,因此您必须将它们屏蔽掉:

style = wx.DEFAULT_FRAME_STYLE & (~wx.CLOSE_BOX) & (~wx.MAXIMIZE_BOX)
super().__init__(whatever, args, you, use, style=style)

如果您想在创建后更改它们,请使用SetWindowStyle

style = self.GetWindowStyle()
self.SetWindowStyle(style & (~wx.CLOSE_BOX) & (~wx.MAXIMIZE_BOX))
self.Refresh()

但是,请注意该函数的文档说:

请注意,某些样式在窗口创建后无法更改,并且可能需要在更改其他样式后调用 Refresh() 才能立即进行更改。

而且,据我所知,在 Windows 上,如果您创建一个带有关闭框的窗口,然后稍后以这种方式将其删除,它实际上并没有消失。它确实禁用了,这可能已经足够了。但如果没有,可能没有办法做你想做的事,要么在wx 下到达本机 Windows API(这变得非常棘手),或者手动在框架上绘制小部件(这变得更加棘手,特别是如果你关心在不同版本的 Windows 上看起来是否正确——更不用说移植到其他平台了)。

【讨论】:

  • 使用此方法时出现错误“TypeError: __init__() 恰好需要 4 个参数(给定 3 个)”
  • @saberman888:你真的不想把(whatever, args, you, use, style=style)放在那里;但是,您当前正在初始化您的窗口,请适当地添加或替换 style 参数。由于您从未展示过代码,因此没有人可以向您展示如何为您的代码执行此操作,但这应该很明显。
  • 您实际上可以通过使用 xor wx.DEFAULT_FRAME_STYLE^(wx.CLOSE_BOX|wx.MAXIMIZE_BOX) 来节省一些操作并使标志设置更加清晰。
  • @nepix32:我认为这实际上不太清楚,因为^ 只是切换位-要了解它是设置它们还是清除它们,您必须查找原始值是什么-而& ~ 明确清除它们。 (但如果您对使用切换感到满意,对于动态情况,您可以使用ToggleWindowStyle 而根本不直接进行任何位操作。)
  • @abanert:+1 指出ToggleWindowStyle,不知道(或者已经忘记了)。
【解决方案2】:

我不久前在blog 上写过关于框架样式的文章。要删除所有按钮,您可以这样做:

import wx

########################################################################
class NoSystemMenuFrame(wx.Frame):
    """
    There is no system menu, which means the title bar is there, but
    no buttons and no menu when clicking the top left hand corner
    of the frame
    """

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        no_sys_menu = wx.CAPTION
        wx.Frame.__init__(self, None, title="No System Menu", style=no_sys_menu)
        panel = wx.Panel(self)
        self.Show()

#----------------------------------------------------------------------
if __name__ == "__main__":
    app = wx.App(False)
    frame = NoSystemMenuFrame()
    app.MainLoop()

我尝试将样式设置为wx.DEFAULT_FRAME_STYLE & (~wx.CLOSE_BOX) & (~wx.MAXIMIZE_BOX)wx.DEFAULT_FRAME_STYLE^(wx.CLOSE_BOX|wx.MAXIMIZE_BOX),但两者似乎都只删除了关闭框。出于某种原因,我的 Xubuntu 机器上仍然存在“最大化”按钮。

【讨论】:

  • 在 Xubuntu 上,最大化小部件可能不受 MAXIMIZE_BOX 控制。 wx 尝试将每个平台的本机小部件映射到其受 Windows 启发的通用小部件的方式并不总是您所期望的。关于如何完成映射的文档隐藏在 wxWidgets (C++) API 的某个地方,不能直接从 wxPython 文档中获得,但是您可以很容易地搜索它,或者只是尝试不同的样式标志来看看哪个是做什么的.
  • 是的,这些年来我一直在玩弄这些样式,但我的印象是 wx 是为了更好地跨平台映射而设计的。
  • 他们尽最大努力使他们的设计跨平台工作,但有些事情在某些平台上是不可能的(例如,在 Mac 上显示 SYSTEM_MENU 而没有 CAPTION),而其他则是非常困难(例如,在未启用 MHM 的情况下在 Motif 上控制 MAXIMIZE_BOX),或者只是丑陋或不标准的平台(这就是为什么 MINIMIZE_BOX 在 Mac 上让您禁用而不是缺席 CLOSE_BOXMAXIMIZE_BOX)。我不知道每个框架如何映射到每个平台的详细信息,但我知道有些问题他们不容易解决。
  • 如果我不得不猜测,在这种情况下的问题可能是在离开 MINIMIZE_BOX 的同时删除 MAXIMIZE_BOX 不能在 Gtk+ 中干净地表示,所以他们找出了最不坏的情况与样式组合有关的事情并做到了。
  • 我向 Robin Dunn 询问了这个问题,他说有些平台会对可以删除和不能删除的内容施加限制。在 Linux 上尤其如此,因为它具有针对不同窗口管理器的策略。所以邓恩先生说wx基本上只是给平台“提示”它应该做某事,但平台可以忽略这个提示。
猜你喜欢
  • 1970-01-01
  • 2021-05-24
  • 2013-06-01
  • 1970-01-01
  • 2022-10-15
  • 1970-01-01
  • 2010-10-19
  • 2015-12-01
  • 1970-01-01
相关资源
最近更新 更多