栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

wxPython 解决 Vertical alignment flags are ignored in vertical sizers

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

wxPython 解决 Vertical alignment flags are ignored in vertical sizers

更新了wxPython之后,运行程序,发现以前OK的程序莫名报错了……

wx._core.wxAssertionError: C++ assertion “!(flags & wxALIGN_BOTTOM)” failed at …srccommonsizer.cpp(2136) in wxBoxSizer::DoInsert(): Vertical alignment flags are ignored in vertical sizers
python-baseException

老版本的wxPython能忽略类似这样的错误,但是4.1之后就不被忽略了……

对于我们这些使用wxFormBuilder的人来说…… 遇到了一点点小麻烦……

当我们改变了某个Sizer的wxVERTICAL或wxHORIZONTAL后,在运行时就会遇到类似的错误


但是~ 此时的wxFormBuilder界面的ToolBar上无法对报错的对齐属性进行编辑了……

下图:我遇到的报错是 m_staticText2 的 wxALIGN_BOTTOM 不能被使用于 Sizer 的 wxVERTICAL 模式下,我需要把它去掉,但无法快捷使用ToolBar上的按钮了。


只能这样做:

打开有问题的控件的属性页的最后一项:flag,把有问题的属性去掉即可。

另外,这样的问题,每执行一次只能找到一个。如果想批量找出来的话,就只能自己写段分析代码了。

原始的.fbp文件是xml格式的,可以分析每个sizer的下一层(注释1)里的控件是否flag属性里有冲突项。反正就是竖着放的Sizer下的控件不能有Align Top Button;横着放的Sizer下的控件不能有Align Left Right

注释1:不是XML的层,实际的XML中多了一层 sizeritem

import xml.etree.ElementTree as EleTree


class CheckFbp:
    def __init__(self, fn):
        with open(fn, "r") as f:
            s = f.read()
        self.root = EleTree.fromstring(s)
        self.treeLvName = list()
    
    def makeOneLevel(self, ele):
        thisLv = dict()
        children = list()
        for i in ele:  # type: EleTree.Element
            if i.tag == "object":
                childLv = self.makeOneLevel(i)
                children.append(childLv)
            try:
                if i.attrib['name'] == "name":
                    thisLv['name'] = i.text
            except Exception:
                pass
            try:
                if i.attrib['name'] == "orient":
                    thisLv['orient'] = i.text
            except Exception:
                pass
            try:
                if i.attrib['name'] == "flag":
                    thisLv['flag'] = i.text
            except Exception:
                pass
        thisLv['children'] = children
        return thisLv
    
    def makeTree(self):
        self.theTree = self.makeOneLevel(self.root)
    
    def check(self):
        self.makeTree()
        for i in self.theTree['children']:
            self.checkOneLv(i)
    
    def checkOneLv(self, data):
        if "name" in data.keys():
            self.treeLvName.append(data['name'])
        else:
            self.treeLvName.append("(NoName)")
        if data['children']:
            for i in data['children']:
                self.checkOneLv(i)
            if "orient" in data.keys():
                for i in data['children']:
                    if "flag" in i.keys() and i['flag'] is not None:
                        if data['orient'] == "wxVERTICAL":
                            if i['flag'].find("wxALIGN_TOP") >= 0 or i['flag'].find("wxALIGN_BOTTOM") >= 0:
                                print "NoTopBottom: %s, %s" % (self.getNameTreeNow(), i['children'][0]['name'])
                        else:
                            if i['flag'].find("wxALIGN_LEFT") >= 0 or i['flag'].find("wxALIGN_RIGHT") >= 0:
                                print "NoLeftRight: %s, %s" % (self.getNameTreeNow(), i['children'][0]['name'])
        self.treeLvName.pop(-1)
    
    def getNameTreeNow(self):
        s = ", ".join(self.treeLvName)
        return s.replace("(NoName), ", "")


if __name__ == '__main__':
    cf = CheckFbp(r"j:NXTemulatorDummyMBIOdummyMBIO_frame.fbp")
    cf.check()

然后会输出结果:(会显示整条有问题的Tree Name)
NoLeftRight: MyProject1, MyPanel14, fgSizer22, bSizer91, bSizer92, bSizer93, m_button58
NoLeftRight: MyProject1, MyPanel15, fgSizer23, fgSizer24, bSizer103, bSizer163, m_button99
NoTopBottom: MyProject1, MyPanelSnComp, bSizer177, bSizer185, bSizer187, bSizer186, bSizer1871, m_checkBox11

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/353002.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号