这是一张图片:
这是我的面板代码:正在使用的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()
如何让左手角落的小家伙填满整个小组?
更新:添加小部件信息以防我以错误的顺序应用内容...
答案 0 :(得分:2)
简短回答:您可能有也可能没有父级面板,但是您没有正确调整大小。由于Windows上的wx.Frame
具有深灰色背景,因此如果您不使用wx.Panel
(并使其大小合适),它将会闪耀。
长答案:试图在代码中包含最少的运行示例。它看起来很丑陋(TextCtrl
和Button
),因为定义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上获得丑陋的灰色背景。main_panel.SetSizer(mymainsizer)
)mymainsizer.Fit(self)
,假设self
是main_panel
的父级。使用self.SetSize((<w>, <h>))
if { {1}}出错了。
答案 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)。删除第二行,代码应该正常工作。
您几乎总是希望将面板作为框架的唯一子项。其他一切都应该是小组的孩子。这给出了正确的着色。它还可以在小部件之间进行选项卡。