尺寸器... - wxPython

3 投票
2 回答
4063 浏览
提问于 2025-04-15 21:29

好的,我正在学习wxPython中的sizer(布局管理器),我想知道是否可以做到类似这样的事情:

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

注意:我确实是从这个链接上看到的 wxPython - 在应用程序中选择合适的sizer

我希望NOTEBOOK(笔记本)能够扩展到左边和底部,IMAGE(图像)能够对齐到左边和底部,而loginform(登录表单)能够对齐到右边和底部。我几乎完成了所有的设置,但现在遇到了一个问题……

问题是我无法单独对齐Loginform和Image(我正在使用Box Sizers),但我希望能够做到这一点。

编辑:为了让大家更清楚我的意思:“哦,我所说的就是,如果我改变对齐方式,它会同时影响LoginForm和Image……例如,如果我把对齐设置为右边,那么Image和Loginform都会被对齐到右边,因为:sizer.Add(sizer4,0, wx.ALIGN_RIGHT | wx.RIGHT, 10)。希望大家这次能理解。”

这是我目前使用的代码,导致了这个问题,任何帮助都很感激。
注意:代码可能(非常)不规范,因为我还在学习box sizers。这里有一段测试代码:

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

2 个回答

0

我想补充一下,我发现用 wxFormBuilder 来先搭建一个代码框架要简单得多,然后再把代码添加到你的项目里,这比在纯Python中反复试错要好很多。

5

这样做怎么样呢?

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) 这个代码会充当一个间隔器,它会占据图片和登录表单之间的所有空间。我不太明白你说的“问题是我不能分别对齐登录表单和图片(我在使用盒子布局),我想要这样做”是什么意思。我主要是按照示例来尝试创建布局的。希望这对你有帮助。

撰写回答