use*_*805 6 python wxwidgets wxpython alignment
我正在使用wxPython来构建一个GUI,我正在尝试对齐一些文本,但它根本不起作用.我正尝试在三个单独的面板中将三个不同的静态文本项对齐(右对齐,中心对齐和左对齐).我得到的结果是,所有三个静态文本控件都在各自面板的左上角对齐.

这是我的代码:
self.lastText=wx.StaticText(self.textDisplayPanel1, label=self.lastWords, style=wx.ALIGN_RIGHT)
self.currentText=wx.StaticText(self.textDisplayPanel2, label=self.currentWords, style=wx.ALIGN_CENTRE)
self.nextText=wx.StaticText(self.textDisplayPanel3, label=self.nextWords, style=wx.ALIGN_LEFT)
Run Code Online (Sandbox Code Playgroud)
关于如何解决这个问题的任何想法?
谢谢!
我正在使用Python 2.7.1和wxPython 2.8.12.1运行mac OSX 10.7.2
joa*_*uin 13
编辑:虽然下面评论的所有内容都适用于Windows,但第一个选项不起作用,例如,Ubuntu可能是一个错误.评论中给出的上一篇文章表明在OSX中发现了同样的问题.
在任何情况下,使用垂直大小调整器的第二个选项在Ubuntu和Windows中都可以工作,因此您可以在OSX上尝试它.
您的文本具有以您希望的方式对齐的指令,wx.ALIGN...并且实际上它是对齐的.但是,StaticText的大小不是面板的大小,而只是文本的大小.将其位置限制为自己的大小后,您无法看到对齐模式之间的差异.
您有两种方法可以解决问题:
选项1.展开StaticText小部件大小并在其上放置文本
您可以使用其size参数扩展StaticText小部件的大小.这是一个糟糕的解决方案,除了固定大小的父级或框架,您不会改变大小或在其他应用程序中重用.如果包含文本的窗口小部件的大小发生更改,则文本的相对位置也将被修改,因为其大小保持不变.所以最好通过sizer来组织你的小部件.
小部件在大小调整器插槽中占用的可用空间比例由第二个参数给出sizer.Add()(0最小大小,1是完全占用):
sizer_2.Add(self.label_1, 0, 0, 0)
Run Code Online (Sandbox Code Playgroud)

要根据需要查看面板中对齐的文本,您必须告诉StaticText扩展到所有可用空间:
sizer_2.Add(self.label_1, 1, 0, 0)
Run Code Online (Sandbox Code Playgroud)

在这里您有相关的代码:
class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
wx.Frame.__init__(self, *args, **kwds)
self.panel_1 = wx.Panel(self, -1)
self.label_1 = wx.StaticText(self.panel_1, -1, "label_1", style=wx.ALIGN_RIGHT)
self.panel_2 = wx.Panel(self, -1)
self.label_2 = wx.StaticText(self.panel_2, -1, "label_2", style=wx.ALIGN_CENTRE)
self.panel_3 = wx.Panel(self, -1)
self.label_3 = wx.StaticText(self.panel_3, -1, "label_3")
self.panel_1.SetBackgroundColour(wx.Colour(0, 255, 0))
self.panel_2.SetBackgroundColour(wx.Colour(0, 255, 255))
self.panel_3.SetBackgroundColour(wx.Colour(219, 112, 147))
sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
sizer_2 = wx.BoxSizer(wx.HORIZONTAL)
sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
sizer_4 = wx.BoxSizer(wx.HORIZONTAL)
sizer_2.Add(self.label_1, 1, 0, 0)
sizer_3.Add(self.label_2, 1, 0, 0)
sizer_4.Add(self.label_3, 1, 0, 0)
self.panel_1.SetSizer(sizer_2)
self.panel_2.SetSizer(sizer_3)
self.panel_3.SetSizer(sizer_4)
sizer_1.Add(self.panel_1, 1, wx.EXPAND, 0)
sizer_1.Add(self.panel_2, 1, wx.EXPAND, 0)
sizer_1.Add(self.panel_3, 1, wx.EXPAND, 0)
self.SetSizer(sizer_1)
sizer_1.Fit(self)
self.Layout()
Run Code Online (Sandbox Code Playgroud)

请注意,代码比需要的时间长,以便使用三个面板模仿您的示例.只使用一个面板即可获得相同的框架视图.事实上,它可以进一步简化,不使用面板并直接在sizer上设置StaticText:
class MyFrame2(wx.Frame):
def __init__(self, *args, **kwds):
wx.Frame.__init__(self, *args, **kwds)
self.label_1 = wx.StaticText(self, -1, "label_1", style=wx.ALIGN_RIGHT)
self.label_2 = wx.StaticText(self, -1, "label_2", style=wx.ALIGN_CENTRE)
self.label_3 = wx.StaticText(self, -1, "label_3")
self.label_1.SetBackgroundColour(wx.Colour(127, 255, 0))
self.label_2.SetBackgroundColour(wx.Colour(0, 255, 255))
self.label_3.SetBackgroundColour(wx.Colour(219, 112, 147))
sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(self.label_1, 1, wx.EXPAND, 0)
sizer.Add(self.label_2, 1, wx.EXPAND, 0)
sizer.Add(self.label_3, 1, wx.EXPAND, 0)
self.SetSizer(sizer)
sizer.Fit(self)
self.Layout()
Run Code Online (Sandbox Code Playgroud)
选项2.将小部件本身定位在大小调整器可用空间的所需位置.您可以将position参数StaticText用于此目的.但是这会产生与上述使用相同的问题size.因此,您希望再次使用sizer控制视图的几何体.您可以使用以下方法之一将小部件放置在sizer中:
sizer_6.Add(self.label_5, 0, wx.ALIGN_RIGHT, 0)
Run Code Online (Sandbox Code Playgroud)
要么
sizer_7.Add(self.label_6, 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
Run Code Online (Sandbox Code Playgroud)
出于某种原因,要使其工作,您需要一个垂直BoxSizer(并且以同样的方式,如果您想使用wx.ALIGN_CENTER_VERTICAL,您将需要一个水平BoxSizer:
class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
wx.Frame.__init__(self, *args, **kwds)
self.panel_4 = wx.Panel(self, -1)
self.label_5 = wx.StaticText(self.panel_4, -1, "label_5")
self.panel_5 = wx.Panel(self, -1)
self.label_6 = wx.StaticText(self.panel_5, -1, "label_6")
self.panel_6 = wx.Panel(self, -1)
self.label_7 = wx.StaticText(self.panel_6, -1, "label_7")
self.panel_4.SetBackgroundColour(wx.Colour(0, 255, 255))
self.panel_5.SetBackgroundColour(wx.Colour(127, 255, 0))
self.panel_6.SetBackgroundColour(wx.Colour(219, 112, 219))
sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
sizer_8 = wx.BoxSizer(wx.VERTICAL)
sizer_7 = wx.BoxSizer(wx.VERTICAL)
sizer_6 = wx.BoxSizer(wx.VERTICAL)
sizer_6.Add(self.label_5, 0, wx.ALIGN_RIGHT, 0)
sizer_7.Add(self.label_6, 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
sizer_8.Add(self.label_7, 0, 0, 0)
self.panel_4.SetSizer(sizer_6)
self.panel_5.SetSizer(sizer_7)
self.panel_6.SetSizer(sizer_8)
sizer_1.Add(self.panel_4, 1, wx.EXPAND, 0)
sizer_1.Add(self.panel_5, 1, wx.EXPAND, 0)
sizer_1.Add(self.panel_6, 1, wx.EXPAND, 0)
self.SetSizer(sizer_1)
sizer_1.Fit(self)
self.Layout()
Run Code Online (Sandbox Code Playgroud)
此选项意味着面板和大小调整器的组合产生的代码比第一个选项显示的代码更难简化.
| 归档时间: |
|
| 查看次数: |
12117 次 |
| 最近记录: |