首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wxPython:将按钮动态流到窗口上的下一行-调整大小

wxPython:将按钮动态流到窗口上的下一行-调整大小
EN

Stack Overflow用户
提问于 2015-06-18 13:13:53
回答 2查看 640关注 0票数 0

下面的wxPython示例代码旨在创建一些按钮,然后将它们添加到水平面板,这样当按钮不再适合面板时,这些按钮就会流到新的行中。

此外,当用户调整框架/窗口大小时,按钮应该更改位置(增加/减少行数)。(请见http://wxpython-users.1045709.n5.nabble.com/Button-wrap-td2365760.html)。

代码语言:javascript
复制
    import wx

words = ['lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur',
'adipisicing', 'elit', 'sed', 'do', 'eiusmod', 'tempor', 'incididunt',
'ut', 'labore', 'et', 'dolore', 'magna', 'aliqua', 'ut', 'enim', 'ad',
'minim', 'veniam', 'quis', 'nostrud', 'exercitation', 'ullamco',
'laboris', 'nisi', 'ut', 'aliquip', 'ex', 'ea', 'commodo',
'consequat', 'duis', 'aute', 'irure', 'dolor', 'in', 'reprehenderit',
'in', 'voluptate', 'velit', 'esse', 'cillum', 'dolore', 'eu',
'fugiat', 'nulla', 'pariatur', 'excepteur', 'sint', 'occaecat',
'cupidatat', 'non', 'proident', 'sunt', 'in', 'culpa', 'qui',
'officia', 'deserunt', 'mollit', 'anim', 'id', 'est', 'laborum']

class Example(wx.Frame):

    def __init__(self, *args, **kwargs):
        super(Example, self).__init__(*args, **kwargs) 
        self.InitUI()
        self.Ctrls()
        i = 0
        for word in words:
            i += 1
            print " word = ",word, "  ",i
            self.gridSizer.SetCols(5)
            button = wx.Button(self.panel, -1, word, size=wx.Size(70,25))
            self.gridSizer.Add(button, 1, wx.EXPAND)
        self.panel.Layout()

    def InitUI(self):

        self.SetSize((800, 400))
        self.SetTitle('Dynamically Flow Buttons to Next Row on Window-Resize')
        self.Centre()
        self.Show(True)

    def Sizers(self):

        self.gridSizer = wx.GridSizer(cols=0, hgap=1, rows=1, vgap=1)
        self.panel.SetSizer(self.gridSizer)

    def Ctrls(self):

        self.Bind(wx.EVT_SIZE, self.OnFrameSize)
        self.panel = wx.Panel(parent=self,pos=wx.Point(0,0), size=wx.Size(750,550), style=wx.TAB_TRAVERSAL)
        self.Sizers()

    def OnFrameSize(self, event):

        self.UpdateButtonLayout()
        event.Skip()

    def UpdateButtonLayout(self):

        panelwidth = self.panel.GetSize().width
        print panelwidth
        factor = panelwidth / 70
        print "Factor: ", factor
        self.gridSizer.SetCols(factor)
        self.panel.Layout()

def main():

    ex = wx.App()
    Example(None)
    ex.MainLoop()

if __name__ == '__main__':
    main()

当我运行这个例子时,我会得到以下错误;

代码语言:javascript
复制
Traceback (most recent call last):
  File "test.py", line 68, in <module>
    main()
  File "test.py", line 64, in main
    Example(None)
  File "test.py", line 26, in __init__
    self.gridSizer.Add(button, 1, wx.EXPAND)
  File "/usr/local/lib/wxPython-3.0.2.0/lib/python2.7/site-packages/wx-3.0-osx_cocoa/wx/_core.py", line 14457, in Add
    return _core_.Sizer_Add(*args, **kwargs)
wx._core.PyAssertionError: C++ assertion "Assert failure" failed at /BUILD/wxPython-src-3.0.2.0/src/common/sizer.cpp(1401) in DoInsert(): too many items (6 > 5*1) in grid sizer (maybe you should omit the number of either rows or columns?)

问题是第26行。当我注释掉它时,我只看到一个按钮。有人能建议一些改变来使它起作用吗?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-18 16:09:42

你要找的是wx.WrapSizer。我对您的代码进行了一些更新,以使用它:

代码语言:javascript
复制
import wx

words = ['lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur',
'adipisicing', 'elit', 'sed', 'do', 'eiusmod', 'tempor', 'incididunt',
'ut', 'labore', 'et', 'dolore', 'magna', 'aliqua', 'ut', 'enim', 'ad',
'minim', 'veniam', 'quis', 'nostrud', 'exercitation', 'ullamco',
'laboris', 'nisi', 'ut', 'aliquip', 'ex', 'ea', 'commodo',
'consequat', 'duis', 'aute', 'irure', 'dolor', 'in', 'reprehenderit',
'in', 'voluptate', 'velit', 'esse', 'cillum', 'dolore', 'eu',
'fugiat', 'nulla', 'pariatur', 'excepteur', 'sint', 'occaecat',
'cupidatat', 'non', 'proident', 'sunt', 'in', 'culpa', 'qui',
'officia', 'deserunt', 'mollit', 'anim', 'id', 'est', 'laborum']

class Example(wx.Frame):

    def __init__(self, *args, **kwargs):
        super(Example, self).__init__(*args, **kwargs) 
        self.InitUI()
        self.Ctrls()
        i = 0
        for word in words:
            i += 1
            print " word = ",word, "  ",i
            button = wx.Button(self.panel, -1, word, size=wx.Size(70,25))
            self.wrapSizer.Add(button, 1, wx.EXPAND)
        self.Show(True)
        self.panel.Layout()

    def InitUI(self):
        self.SetSize((800, 400))
        self.SetTitle('Dynamically Flow Buttons to Next Row on Window-Resize')
        self.Centre()


    def Sizers(self):
        self.wrapSizer = wx.WrapSizer()
        self.panel.SetSizer(self.wrapSizer)

    def Ctrls(self):
        self.panel = wx.Panel(parent=self,pos=wx.Point(0,0), size=wx.Size(750,550), style=wx.TAB_TRAVERSAL)
        self.Sizers()



def main():

    ex = wx.App()
    Example(None)
    ex.MainLoop()

if __name__ == '__main__':
    main()

请注意,您不能设置列数。您可以从以下网站了解更多关于这个有趣小部件的信息:

  • http://www.blog.pythonlibrary.org/2014/01/22/wxpython-wrap-widgets-with-wrapsizer/
  • http://wxpython.org/Phoenix/docs/html/WrapSizer.html
票数 1
EN

Stack Overflow用户

发布于 2017-01-08 15:51:00

使用FlexGridSizer的延迟回答将实现相同的结果,其中行数设置为零。

在问题代码中,还必须删除行self.gridSizer.SetCols(5)

代码语言:javascript
复制
import wx

words = ['lorem', 'ipsum', 'dolor', 'sit', 'amet', 'consectetur',
'adipisicing', 'elit', 'sed', 'do', 'eiusmod', 'tempor', 'incididunt',
'ut', 'labore', 'et', 'dolore', 'magna', 'aliqua', 'ut', 'enim', 'ad',
'minim', 'veniam', 'quis', 'nostrud', 'exercitation', 'ullamco',
'laboris', 'nisi', 'ut', 'aliquip', 'ex', 'ea', 'commodo',
'consequat', 'duis', 'aute', 'irure', 'dolor', 'in', 'reprehenderit',
'in', 'voluptate', 'velit', 'esse', 'cillum', 'dolore', 'eu',
'fugiat', 'nulla', 'pariatur', 'excepteur', 'sint', 'occaecat',
'cupidatat', 'non', 'proident', 'sunt', 'in', 'culpa', 'qui',
'officia', 'deserunt', 'mollit', 'anim', 'id', 'est', 'laborum']

class Example(wx.Frame):

    def __init__(self, *args, **kwargs):
        super(Example, self).__init__(*args, **kwargs) 
        self.InitUI()
        self.Ctrls()
        i = 0
        for word in words:
            i += 1
            print " word = ",word, "  ",i
            button = wx.Button(self.panel, -1, word, size=wx.Size(70,25))
            self.gridSizer.Add(button, 1, wx.EXPAND)
        self.panel.Layout()

    def InitUI(self):

        self.SetSize((800, 400))
        self.SetTitle('Dynamically Flow Buttons to Next Row on Window-Resize')
        self.Centre()
        self.Show(True)

    def Sizers(self):

        self.gridSizer = wx.FlexGridSizer(0,5,1,1)
        self.panel.SetSizer(self.gridSizer)

    def Ctrls(self):

        self.Bind(wx.EVT_SIZE, self.OnFrameSize)
        self.panel = wx.Panel(parent=self,pos=wx.Point(0,0), size=wx.Size(750,550), style=wx.TAB_TRAVERSAL)
        self.Sizers()

    def OnFrameSize(self, event):

        self.UpdateButtonLayout()
        event.Skip()

    def UpdateButtonLayout(self):

        panelwidth = self.panel.GetSize().width
        print panelwidth
        factor = panelwidth / 70
        print "Factor: ", factor
        self.gridSizer.SetCols(factor)
        self.panel.Layout()

def main():

    ex = wx.App()
    Example(None)
    ex.MainLoop()

if __name__ == '__main__':
    main()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30916360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档