【发布时间】:2015-03-24 16:48:22
【问题描述】:
这确实是一个 Pycharm - IDE 问题 - python/wx 错误已修复。
一个看似无害的更改破坏了下面的raceText.SetLabel() 调用(它只是在静态文本控件中设置文本)。所以我在item = self.items[itemDex]中设置了一个断点:
def __init__(self):
# ...
self.raceText = staticText(self,u'') # see below for staticText definition
def EvtListBox(self,event):
"""Responds to listbox selection."""
itemDex = event.GetSelection()
item = self.items[itemDex] # breakpoint here
face = self.data[item]
self.nameText.SetLabel(face.pcName)
self.raceText.SetLabel(face.getRaceName()) # this
瞧,self.raceText.SetLabel(face.getRaceName()) 现在成功了。
那么这怎么可能呢?设置断点触发什么?
编辑:更多数据:
最初破坏 SetLabel() 调用的是这个提交:
-def staticText(parent,label=u'',pos=defPos,size=defSize,style=0,name=u"staticText",id=defId,):
+def staticText(parent, label=u'', pos=defPos, size=defSize, style=0,
+ noAutoResize=True, name=u"staticText"):
"""Static text element."""
- return wx.StaticText(parent,id,label,pos,size,style,name)
+ if noAutoResize: style |= wx.ST_NO_AUTORESIZE
+ return wx.StaticText(parent, defId, label, pos, size, style, name)
将 noAutoResize 默认值翻转为 False 可以解决错误 - 文本已设置但 wx.ST_NO_AUTORESIZE 会阻止控件从 u'' 调整其大小 - 因此没有显示文本。所以这是一个普通的老错误。
问题仍然存在为什么在调试器self.raceText.SetLabel() 中设置断点时会显示文本?
编辑:请阅读答案 - 健全性检查
【问题讨论】:
-
如果您告诉 PyCharm 继续,UI 更新是否正确?你在什么操作系统上?你有一个小的可运行代码示例吗?
-
@MikeDriscoll:是的,它正确更新了用户界面,这就是重点——
(<wx._controls.StaticText; proxy of <Swig Object of type 'wxStaticText *' at 0x7a506d8> >, u'Breton')是 SetLabel 调用的参数。抱歉,没有小的可运行示例 - 这是代码:github.com/wrye-bash/wrye-bash/blob/… -
也许我不明白。断点导致
self.raceText.SetLabel()不被调用,对吗?断点在那条线之前,对吗?如果是这样,那么这正是应该发生的事情。到达断点时会暂停执行,以便您进行调试。 -
@MikeDriscoll:不相反:当我运行调试器并且没有放置断点时,UI 没有正确更新。所以我放了一个断点来看看到底发生了什么,它到达了断点,一切看起来都很正常 - 我按 F8 - 继续执行并且 UI 更新正确!
-
如果不运行调试器而只是正常运行会发生什么?那它行得通吗?如果是这样,那么这听起来可能是 PyCharm 的一个错误。
标签: python-2.7 wxpython pycharm