更新了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



