2014-05-25 48 views
0

确定这对你很简单。 :)但我试图打开一个“首选项”菜单,并弹出并显示应用程序存储的首选项。我的问题现在是化妆品,我不知道我的应用程序左上角的小“俄罗斯方块片”是什么。这是我想填补整个框架的颜色,但我无法弄清楚如何做到这一点。wxPython面板是两个灰色阴影?

这里有一个形象:

enter image description here

这里是我的面板代码重用:

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() 

如何让小家伙了在左边角落,填补了:在使用分级机整个面板?

UPDATE:的情况下添加小部件的信息,我正在申请的事以错误的顺序...

回答

2

简答回答:您可能有也可能没有父面板,但您没有正确设置尺寸。由于Windows上的wx.Frame具有深灰色背景,因此如果您不使用wx.Panel(并使其尺寸正确),它将发光。

长答案:试图从您的代码中包含一个最小的运行示例。它看起来很丑陋(TextCtrlButton),因为定义panel来自外部,并且很难同步它们的尺寸。在全部元素创建/调整在一个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中与尺寸仪工作:

  • 始终使用wx.Panel作为父母你的控制。无论您的控件本身是否在面板上进行操作,您都可以根据需要将它们堆叠在任意层上。如果你的家长直接到wx.Frame,你会在Windows上看到丑陋的灰色背景。
  • 定义您的控制对象(可以再次面板)
  • 选择合适的定径机
  • 布局筛分器所有的元素
  • 重要:告诉你的主分级机到父元素来定位本身(main_panel.SetSizer(mymainsizer)
  • 告诉主面板的面板父的大小以适应(mymainsizer.Fit(self)其中筛分器,假设selfmain_panel父。使用self.SetSize((<w>, <h>))如果Fit出错。

Example sizer for this question

+0

由于它是最完整和最具建设性的答案,因此它已被接受 - 谢谢 - 它工作得非常好。 – chow

1

您还需要设置panel为其他控件不frame的父。

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

prefPanel = wx.Panel(self) 
prefPanel = self 

这是完全错误的。

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

+0

我在哪里可以设置面板作为父级? (我对此非常感兴趣:) :) – chow

+0

在每个控件的创建者,即按钮,文本字段,静态文本中,都有一个父参数,通常是/总是第一个参数。 –

1

你有一些不正确的对象,可能是因为你致电panel = self。当你这样做时,你告诉解释器使用你的框架而不是你的面板作为你以后试图通过类似wx.StaticText(panel)创建的任何东西。另外可疑的是需要致电global sizer2。您如何/为什么在使用前声明sizer大小,以至于他们需要全局关键字?

+0

删除全球sizer2,无法记住我在那里试图做什么。没有负面影响任何事情。我的其他选择是什么,而不是'parent = self'?如果我删除它,它会显示LESS而不是其中的内容(所有静态标签消失,只有浏览按钮出现?) – chow

0

这是一个教养问题:

prefPanel = wx.Panel(self) 
prefPanel = self 

首先你设置prefPanel对象是一个wx.Panel,那么您可以覆盖它,并把它设回帧(即自)。删除第二行,代码应该正常工作。

你几乎总是希望有一个面板作为一个框架的唯一孩子。其他一切都应该是小组的一个孩子。这给了正确的着色。它还支持在小部件之间进行选项卡的功能。