面板中的填充和 wxpython 中的静态文本换行
Padding in Panel and static text wrap in wxpython
我想要这样的布局
框架内有一个主面板,左右空白填充,另一个子面板位于中间。位于子面板顶部的静态文本元素,在更改 window 大小时应正确换行。
我的代码片段如下
import wx
class MyPanel(wx.Panel):
def __init__(self, parent):
super(MyPanel, self).__init__(parent)
self.hsizer = wx.BoxSizer()
self.hsizer.AddStretchSpacer()
self.panel = wx.Panel(self)
self.panel.SetSize((350, -1))
self.vsizer = wx.BoxSizer(wx.VERTICAL)
label = (
"This is a long scentence that I want it wrapped properly, "
"but it doesn't seem to work at work. "
"I prefer if you guys can give any sugeestions or help. "
"For Long Long Long Long Long scentence."
)
style = wx.ALIGN_LEFT
self.static_text = wx.StaticText(self, label=label, style=style)
self.vsizer.Add(self.static_text, flag=wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border=5)
self.static_text.Wrap(self.panel.Size[0])
self.static_text.SetAutoLayout(True)
self.panel.SetSizer(self.vsizer)
self.hsizer.Add(self.panel, flag=wx.ALIGN_CENTER)
self.hsizer.AddStretchSpacer()
self.SetSizer(self.hsizer)
self.Layout()
print self.Size
print self.panel.Size
if __name__ == '__main__':
app = wx.App()
frame = wx.Frame(None)
sizer = wx.BoxSizer()
sizer.Add(MyPanel(frame), flag=wx.EXPAND)
frame.SetSizer(sizer)
frame.Show()
app.MainLoop()
目前,不仅子面板不在中间,而且在更改 window 大小时,静态文本中的文本也无法正确换行。有什么建议可以让它发挥作用吗?
在尝试使用 sizer 实现布局时设置一些背景颜色通常很有帮助,这样可以很容易地看到边界在哪里,以及它们在调整事物大小时的行为方式。另一个有用的工具是 Widget Inspection Tool。例如:
import wx
class MyPanel(wx.Panel):
def __init__(self, parent):
super(MyPanel, self).__init__(parent)
self.SetBackgroundColour('pink')
self.hsizer = wx.BoxSizer()
self.hsizer.AddStretchSpacer()
self.panel = wx.Panel(self)
self.panel.SetSize((350, -1))
self.panel.SetBackgroundColour('green')
self.vsizer = wx.BoxSizer(wx.VERTICAL)
label = (
"This is a long scentence that I want it wrapped properly, "
"but it doesn't seem to work at work. "
"I prefer if you guys can give any sugeestions or help. "
"For Long Long Long Long Long scentence."
)
style = wx.ALIGN_LEFT
self.static_text = wx.StaticText(self, label=label, style=style)
self.static_text.SetBackgroundColour('yellow')
self.vsizer.Add(self.static_text, flag=wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border=5)
self.static_text.Wrap(self.panel.Size[0])
self.static_text.SetAutoLayout(True)
self.panel.SetSizer(self.vsizer)
self.hsizer.Add(self.panel, flag=wx.ALIGN_CENTER)
self.hsizer.AddStretchSpacer()
self.SetSizer(self.hsizer)
if __name__ == '__main__':
app = wx.App()
frame = wx.Frame(None)
frame.SetBackgroundColour('sky blue')
sizer = wx.BoxSizer()
sizer.Add(MyPanel(frame), flag=wx.EXPAND)
frame.SetSizer(sizer)
frame.Show()
import wx.lib.inspection
wx.lib.inspection.InspectionTool().Show()
app.MainLoop()
在 运行 之后,我们可以看到内容与您的布局草图并不完全匹配,当调整框架大小时文本等内容不会改变大小或位置,并且 MyPanel (粉红色的)也没有调整大小来填充框架。此外,从代码中可以看出,您希望文本成为绿色面板 (self.panel) 的子项,但在运行时查看颜色显然不是。再次查看代码,我们发现它是以 self 作为父级而不是 self.panel.
创建的
因此,在进行了一些调整以解决这些问题之后,我们最终得到了以下代码:
import wx
class MyPanel(wx.Panel):
def __init__(self, parent):
super(MyPanel, self).__init__(parent)
self.SetBackgroundColour('pink')
self.hsizer = wx.BoxSizer()
self.hsizer.AddStretchSpacer()
self.panel = wx.Panel(self)
self.panel.SetSize((350, -1))
self.panel.SetBackgroundColour('green')
self.vsizer = wx.BoxSizer(wx.VERTICAL)
label = (
"This is a long scentence that I want it wrapped properly, "
"but it doesn't seem to work at work. "
"I prefer if you guys can give any sugeestions or help. "
"For Long Long Long Long Long scentence."
)
style = wx.ALIGN_LEFT
self.static_text = wx.StaticText(self.panel, label=label, style=style)
self.static_text.SetBackgroundColour('yellow')
self.vsizer.Add(self.static_text,
flag=wx.EXPAND | wx.ALL | wx.ALIGN_TOP, border=5)
self.static_text.Wrap(self.panel.Size[0])
self.panel.SetSizer(self.vsizer)
self.hsizer.Add(self.panel, 1, flag=wx.EXPAND)
self.hsizer.AddStretchSpacer()
self.SetSizer(self.hsizer)
if __name__ == '__main__':
app = wx.App()
frame = wx.Frame(None)
frame.SetBackgroundColour('sky blue')
sizer = wx.BoxSizer()
sizer.Add(MyPanel(frame), 1, flag=wx.EXPAND)
frame.SetSizer(sizer)
frame.Show()
import wx.lib.inspection
wx.lib.inspection.InspectionTool().Show()
app.MainLoop()
最后,如果您希望文本在尺寸小于 350 时重新换行,那么您需要执行类似捕获 EVT_SIZE 事件的操作,并在需要时以不同的尺寸再次调用换行。
我想要这样的布局
框架内有一个主面板,左右空白填充,另一个子面板位于中间。位于子面板顶部的静态文本元素,在更改 window 大小时应正确换行。
我的代码片段如下
import wx
class MyPanel(wx.Panel):
def __init__(self, parent):
super(MyPanel, self).__init__(parent)
self.hsizer = wx.BoxSizer()
self.hsizer.AddStretchSpacer()
self.panel = wx.Panel(self)
self.panel.SetSize((350, -1))
self.vsizer = wx.BoxSizer(wx.VERTICAL)
label = (
"This is a long scentence that I want it wrapped properly, "
"but it doesn't seem to work at work. "
"I prefer if you guys can give any sugeestions or help. "
"For Long Long Long Long Long scentence."
)
style = wx.ALIGN_LEFT
self.static_text = wx.StaticText(self, label=label, style=style)
self.vsizer.Add(self.static_text, flag=wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border=5)
self.static_text.Wrap(self.panel.Size[0])
self.static_text.SetAutoLayout(True)
self.panel.SetSizer(self.vsizer)
self.hsizer.Add(self.panel, flag=wx.ALIGN_CENTER)
self.hsizer.AddStretchSpacer()
self.SetSizer(self.hsizer)
self.Layout()
print self.Size
print self.panel.Size
if __name__ == '__main__':
app = wx.App()
frame = wx.Frame(None)
sizer = wx.BoxSizer()
sizer.Add(MyPanel(frame), flag=wx.EXPAND)
frame.SetSizer(sizer)
frame.Show()
app.MainLoop()
目前,不仅子面板不在中间,而且在更改 window 大小时,静态文本中的文本也无法正确换行。有什么建议可以让它发挥作用吗?
在尝试使用 sizer 实现布局时设置一些背景颜色通常很有帮助,这样可以很容易地看到边界在哪里,以及它们在调整事物大小时的行为方式。另一个有用的工具是 Widget Inspection Tool。例如:
import wx
class MyPanel(wx.Panel):
def __init__(self, parent):
super(MyPanel, self).__init__(parent)
self.SetBackgroundColour('pink')
self.hsizer = wx.BoxSizer()
self.hsizer.AddStretchSpacer()
self.panel = wx.Panel(self)
self.panel.SetSize((350, -1))
self.panel.SetBackgroundColour('green')
self.vsizer = wx.BoxSizer(wx.VERTICAL)
label = (
"This is a long scentence that I want it wrapped properly, "
"but it doesn't seem to work at work. "
"I prefer if you guys can give any sugeestions or help. "
"For Long Long Long Long Long scentence."
)
style = wx.ALIGN_LEFT
self.static_text = wx.StaticText(self, label=label, style=style)
self.static_text.SetBackgroundColour('yellow')
self.vsizer.Add(self.static_text, flag=wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border=5)
self.static_text.Wrap(self.panel.Size[0])
self.static_text.SetAutoLayout(True)
self.panel.SetSizer(self.vsizer)
self.hsizer.Add(self.panel, flag=wx.ALIGN_CENTER)
self.hsizer.AddStretchSpacer()
self.SetSizer(self.hsizer)
if __name__ == '__main__':
app = wx.App()
frame = wx.Frame(None)
frame.SetBackgroundColour('sky blue')
sizer = wx.BoxSizer()
sizer.Add(MyPanel(frame), flag=wx.EXPAND)
frame.SetSizer(sizer)
frame.Show()
import wx.lib.inspection
wx.lib.inspection.InspectionTool().Show()
app.MainLoop()
在 运行 之后,我们可以看到内容与您的布局草图并不完全匹配,当调整框架大小时文本等内容不会改变大小或位置,并且 MyPanel (粉红色的)也没有调整大小来填充框架。此外,从代码中可以看出,您希望文本成为绿色面板 (self.panel) 的子项,但在运行时查看颜色显然不是。再次查看代码,我们发现它是以 self 作为父级而不是 self.panel.
创建的因此,在进行了一些调整以解决这些问题之后,我们最终得到了以下代码:
import wx
class MyPanel(wx.Panel):
def __init__(self, parent):
super(MyPanel, self).__init__(parent)
self.SetBackgroundColour('pink')
self.hsizer = wx.BoxSizer()
self.hsizer.AddStretchSpacer()
self.panel = wx.Panel(self)
self.panel.SetSize((350, -1))
self.panel.SetBackgroundColour('green')
self.vsizer = wx.BoxSizer(wx.VERTICAL)
label = (
"This is a long scentence that I want it wrapped properly, "
"but it doesn't seem to work at work. "
"I prefer if you guys can give any sugeestions or help. "
"For Long Long Long Long Long scentence."
)
style = wx.ALIGN_LEFT
self.static_text = wx.StaticText(self.panel, label=label, style=style)
self.static_text.SetBackgroundColour('yellow')
self.vsizer.Add(self.static_text,
flag=wx.EXPAND | wx.ALL | wx.ALIGN_TOP, border=5)
self.static_text.Wrap(self.panel.Size[0])
self.panel.SetSizer(self.vsizer)
self.hsizer.Add(self.panel, 1, flag=wx.EXPAND)
self.hsizer.AddStretchSpacer()
self.SetSizer(self.hsizer)
if __name__ == '__main__':
app = wx.App()
frame = wx.Frame(None)
frame.SetBackgroundColour('sky blue')
sizer = wx.BoxSizer()
sizer.Add(MyPanel(frame), 1, flag=wx.EXPAND)
frame.SetSizer(sizer)
frame.Show()
import wx.lib.inspection
wx.lib.inspection.InspectionTool().Show()
app.MainLoop()
最后,如果您希望文本在尺寸小于 350 时重新换行,那么您需要执行类似捕获 EVT_SIZE 事件的操作,并在需要时以不同的尺寸再次调用换行。