【问题标题】:Sizers... - wxPythonSizer... - wxPython
【发布时间】:2010-04-12 03:24:55
【问题描述】:

好的,所以我正在学习 wxPython 中的 sizers,我想知道是否可以执行以下操作:

==============================================
|WINDOW TITLE                          _ [] X|
|============================================|
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxxxNOTEBOOKxxxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|
|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx|
|________                         ___________|
|IMAGE   |                       |LoginForm  |
|________|                       |___________|
==============================================

注意:是的,我确实是从 wxPython - picking the right sizer to use in an application 那里得到的

NOTEBOOK 扩展到左下角,IMAGE 左下角对齐,loginform 右下角对齐,我几乎完成了所有操作,但现在我遇到了问题..

问题是我无法分别对齐 Loginform 和 Image(我使用 Box Sizer),我想这样做。

编辑:所以每个人都能明白我的意思: “哦,我指的是,基本上,如果我改变了对齐方式,它会影响 LoginForm 和 Image。例如,如果我将 align 设置为 RIGHT,则 image 和 loginform 都将向右对齐,因为:sizer.Add(sizer4,0, wx.ALIGN_RIGHT | wx.RIGHT, 10)。希望你们这次能看懂”

这是我目前正在使用的导致问题的代码,不胜感激。 注意:代码可能(非常)草率,因为我仍在学习 box sizer。 这是一个测试代码:

import wx
class Sizerframe(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, 'sizertestframe',size=(790, 524))
        p = wx.Panel(self)
        nb = wx.Notebook(p, size = (750, 332))
        button = wx.Button(p, -1, "loginform1rest", size=(94,23))
        button1 = wx.Button(p, -1, "Login", size=(94,23))
        button2 = wx.Button(p, -1, "Cancel", size=(94,23))
        imagebutton = wx.Button(p, -1, "imagebutton", size=(94,23))



        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer1 = wx.BoxSizer(wx.HORIZONTAL)
        sizer1.Add(nb,1, wx.EXPAND)
        sizer.Add(sizer1,1, wx.LEFT | wx.RIGHT | wx.EXPAND, 10)
        sizer.Add((-1, 25))
        sizer2 = wx.BoxSizer(wx.VERTICAL)
        sizer2.Add(button, 0)
        sizer3 = wx.BoxSizer(wx.HORIZONTAL)
        sizer3.Add(button1, 0)
        sizer3.Add(button2,0, wx.LEFT, 5)
        sizer2.Add(sizer3, 0)

        sizer4 = wx.BoxSizer(wx.HORIZONTAL)
        sizer4.Add(imagebutton, 1, wx.LEFT | wx.BOTTOM)
        sizer4.Add(sizer2,0, wx.RIGHT | wx.BOTTOM , 5)
        sizer.Add(sizer4,0, wx.ALIGN_RIGHT | wx.RIGHT, 10)
        p.SetSizer(sizer)

def main():
    app = wx.App()
    frame = Sizerframe()
    frame.Show()
    app.MainLoop()
if __name__ == '__main__':
    main()

【问题讨论】:

  • wxGlade。学习它,生活它,热爱它。它并不完美,但比从头开始手工编码要好得多。
  • 感谢您的建议,虽然我仍然想知道是否有可能解决我的问题:)。
  • @Francisco – 您能否发布一个最小但有效的示例的完整代码?请尽可能简单,不要使用图像、登录框等,而只需使用按钮或面板。可能有更好的例子,但我希望得到类似我在这里发布的内容:stackoverflow.com/questions/2546979/2549783#2549783
  • @Francisco Aleixo,放一个我们可以运行和试验的小代码,然后很容易放一个解决方案
  • 好的,但是现在您的代码和图片不匹配,因为您添加了额外的按钮。如果它符合您的要求,我建议删除额外的按钮而不是将它们添加到图片中。目前,您的示例代码中的 sizer 嵌套相当深,因此很难猜出您的目标。

标签: python wxpython boxsizer


【解决方案1】:

这样的事情怎么样?

container = wx.BoxSizer(wx.VERTICAL)
container.Add(self.nb, 1, wx.EXPAND)

login = wx.BoxSizer(wx.VERTICAL)
login.Add(self.userLabel)
login.Add(self.userText)

# ... clip, rest of login form additions here

bottom = wx.BoxSizer(wx.HORIZONTAL)
bottom.Add(image)
bottom.Add((0, 0), 1, wx.EXPAND)
bottom.Add(login)

container.Add(bottom, 1, wx.EXPAND)

基本上,bottom.Add((0, 0), 1, wx.EXPAND) 将充当一个分隔符,占据图像和登录表单之间的所有空间。我不太明白您所说的“问题是我无法分别对齐 Loginform 和 Image(我使用 Box Sizer),我想”是什么意思。我大多只是按照插图来尝试创建布局。我希望这会有所帮助。

【讨论】:

  • 感谢您的回复,明天我要睡觉了再分析一下,我还添加了一个测试代码以防您想弄乱它,仍然非常感谢您的回复
  • 没问题。您可以使用嵌套 BoxSizer 的不同组合来制作大多数布局。
  • 您应该考虑使用bottom.AddStretchSpacer(),而不是手动构建的垫片。
  • 哦,把 container.Add(bottom) 改成 container.Add(bottom, 1, ex.EXPAND) - 很抱歉。
  • 哎呀,试试这个:container.Add(bottom, 0, wx.EXPAND)
【解决方案2】:

只是在这里标记,我一直发现在 wxFormBuilder 中制作代码骨架然后将代码添加到您的项目中更容易,而不是在纯 Python 中反复试验。

【讨论】:

    猜你喜欢
    • 2021-06-09
    • 1970-01-01
    • 2013-08-01
    • 2015-10-25
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多