wxPython面板是两种灰色阴影?

时间:2014-05-25 20:50:12

标签: wxpython

确保这对你来说很容易。 :)但我正试图打开一个"偏好"菜单并弹出并显示应用程序存储的首选项。我的问题现在是化妆品,我不知道这个小小的"俄罗斯方块片"在我的应用程序的左上角。这是我想填充整个画面的颜色,但我无法弄清楚如何做到这一点。

这是一张图片:

enter image description here

这是我的面板代码:正在使用的sizer:

def __init__(self):
    """Constructor"""
    import wx.lib.inspection
    wx.lib.inspection.InspectionTool().Show()                    

    wx.Frame.__init__(self, None, title="Title Options", size=(520, 390))

    prefPanel = wx.Panel(self)
    prefPanel = self

    # SET THE SIZER OBJECT UP
    prefSizer = wx.GridBagSizer(13, 9)

    # SET BASELINE INDEX VARIABLES
    xIndex = 0
    yIndex = 0

# DEFAULT DATABSE EXTENSIONS
    self.tc_DBExt = wx.TextCtrl(prefPanel, -1, "", (0,0), (150,21))
    self.label_DBExt = wx.StaticText(prefPanel, label="Default Database Extensions:")
    help_tc_DBExt= "Enter this as: *.<extension>"
    self.tc_DBExt.SetToolTip(wx.ToolTip(help_tc_DBExt))        
    self.tc_DBExt.Value = guiFunctions.configMe("general", "database_extensions")

    prefSizer.Add(self.label_DBExt, pos=(xIndex, 0), flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL|wx.TOP, border=10)
    prefSizer.Add(self.tc_DBExt, pos=(xIndex, 1), span=(1,5), flag=wx.EXPAND|wx.LEFT|wx.ALIGN_CENTER_VERTICAL|wx.TOP, border=10).SetMinSize((200,22))


    panel.SetSizer(sizer2)
    sizer2.Fit(panel)

    panel.Refresh()
    panel.Update()
    panel.Layout()

如何让左手角落的小家伙填满整个小组?

更新:添加小部件信息以防我以错误的顺序应用内容...

4 个答案:

答案 0 :(得分:2)

简短回答:您可能有也可能没有父级面板,但是您没有正确调整大小。由于Windows上的wx.Frame具有深灰色背景,因此如果您不使用wx.Panel(并使其大小合适),它将会闪耀。

长答案:试图在代码中包含最少的运行示例。它看起来很丑陋(TextCtrlButton),因为定义panel来自外部,并且很难同步它们的sizer。在一个wx.Panel / wx.Frame中执行所有元素创建/大小调整会更好。我对你的代码的所有评论都包含在三重引号中,并且应该让你知道为什么你要做的事情是复杂的/坏的/简单的不起作用。

import wx

class panel_class(wx.Panel):
    def __init__(self, *args, **kwds):
        """Trying to implement your magic ``panel```"""
        wx.Panel.__init__(self, *args, **kwds)
        pnl = self
        szmain = wx.BoxSizer(wx.HORIZONTAL)
        szmain.Add(wx.TextCtrl(pnl, -1, 'Database path'), 1, wx.EXPAND)
        szmain.Add(wx.Button(pnl, -1, 'Database path'), 0, wx.EXPAND)
        pnl.SetSizer(szmain)


class myframe(wx.Frame):
    def __init__(self, *args, **kwds):
        """Constructor"""

        wx.Frame.__init__(self, *args, **kwds)#None, title="Title Options", size=(520, 390))

        prefPanel = wx.Panel(self)

        """This makes no sense: according to the wx.Frame.__init__ above self is a wx.Frame."""
#         prefPanel = self

        # SET THE SIZER OBJECT UP
        prefSizer = wx.GridBagSizer(13, 9)

        # SET BASELINE INDEX VARIABLES
        xIndex = 0
        yIndex = 0

        # DEFAULT DATABSE EXTENSIONS
        self.tc_DBExt = wx.TextCtrl(prefPanel, -1, "", (0,0), (150,21))
        self.label_DBExt = wx.StaticText(prefPanel, label="Default Database Extensions:")
        help_tc_DBExt= "Enter this as: *.<extension>"
        self.tc_DBExt.SetToolTip(wx.ToolTip(help_tc_DBExt))
        """Replaced with something static."""
        self.tc_DBExt.Value = 'conftxt'#guiFunctions.configMe("general", "database_extensions")

        prefSizer.Add(self.label_DBExt, pos=(xIndex, 0), flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL|wx.TOP, border=10)
        prefSizer.Add(self.tc_DBExt, pos=(xIndex, 1), span=(1,5), flag=wx.EXPAND|wx.LEFT|wx.ALIGN_CENTER_VERTICAL|wx.TOP, border=10).SetMinSize((200,22))

        """Assuming panel definition from outside.

        It has to be created here. If it is to be created **before**
        the parent is created, it is very complicated to create it with a
        dummy parent and ``Reparent`` it to this Frame/Panel. Don't do that."""

        panel = panel_class(prefPanel, -1)

        """Attach ``panel`` to a sizer in **this** hierarchy
        It looks disconnected, because it has brought already it's own
        sizer, which is child to the GridBagSizer.""" 
        xindex = 1
        prefSizer.Add(panel, pos=(xindex, 0), span=(1,5), flag=wx.EXPAND|wx.LEFT|wx.ALIGN_CENTER_VERTICAL|wx.TOP, border=10).SetMinSize((200,22))

        """You have to tell wxPython somehow to what element the sizer is coupled (in this case to the main pane)l"""
        prefPanel.SetSizer(prefSizer)

        """I have no idea """
        #panel.SetSizer(sizer2)
        #sizer2.Fit(panel)

        """Normally not needed/happening automagically on standard controls"""    
        #panel.Refresh()
        #panel.Update()
        #panel.Layout()

    def add_panel_to_layout(self):
        pass

if __name__ == '__main__':
    app = wx.App(0)

    frm = myframe(None, -1,  title="Title Options", size=(520, 390))

    frm.Show()

    """Call it here **after** all elements have been created"""
    import wx.lib.inspection
    wx.lib.inspection.InspectionTool().Show()
    app.MainLoop()

在wxPython中使用Sizer的规则:

  • 始终使用wx.Panel作为控件的父级。如果您的控件本身是面板上的父级,则可以将它们堆叠在您想要的任意数量的层上。如果您直接指向wx.Frame,则会在Windows上获得丑陋的灰色背景。
  • 定义控件对象(可以再次成为面板)
  • 选择合适的sizer
  • 在sizer中布置所有元素
  • 重要提示:告诉您的主sizer要定位哪个父元素(main_panel.SetSizer(mymainsizer)
  • 告诉主要面板的sizer,面板父级的大小要适应(mymainsizer.Fit(self),假设selfmain_panel的父级。使用self.SetSize((<w>, <h>)) if { {1}}出错了。

Example sizer for this question

答案 1 :(得分:1)

您还需要将panel设置为其他控件的父级而不是frame

您的更新代码显示了另一个问题:

 prefPanel = wx.Panel(self)
 prefPanel = self

这是完全错误的。

提示:要诊断此类问题,您可以运行Widget Inspection Control

答案 2 :(得分:1)

由于您致电panel = self,可能会错误地显示某些内容。当你这样做时,你告诉口译员使用你的Frame而不是你的Panel作为你后来尝试通过wx.StaticText(panel)之类的东西创建的任何东西的父亲。同样可疑的是需要拨打global sizer2。你如何/为什么在使用前声明sizer,他们需要全局关键字?

答案 3 :(得分:0)

这是一个育儿问题:

prefPanel = wx.Panel(self)
prefPanel = self

首先将 prefPanel 对象设置为wx.Panel,然后覆盖它并将其设置回帧(即self)。删除第二行,代码应该正常工作。

您几乎总是希望将面板作为框架的唯一子项。其他一切都应该是小组的孩子。这给出了正确的着色。它还可以在小部件之间进行选项卡。

相关问题