在pycharm中设置断点会更改代码的行为

时间:2015-03-24 16:48:23

标签: python-2.7 wxpython pycharm

这真的是一个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()中设置断点时显示文本

编辑:请阅读答案 - 完整性检查

1 个答案:

答案 0 :(得分:0)

IIUC,我认为在调试器中运行只是隐藏或混淆真正的问题。

当wx.ST_NO_AUTORESIZE 未设置时,对标签的更改将导致调整窗口小部件的大小,这通常会导致窗口小部件很快通过自动绘制事件重新绘制来自系统。当wx.ST_NO_AUTORESIZE 设置时,调整大小不会发生,因此特定的绘制事件不会发生,并且在下次刷新父节点之前,小部件可能不会重新绘制或发生触发油漆事件的其他事情。

因此,可能的解决方法是在每个self.fooText.Refresh()之后添加对SetLabel的调用。在调试器中停止时,显示仍然不会更新,因为绘制事件通常不会发生,直到返回到活动事件循环,但在正常运行中,它将很快发生,用户将不会注意到,除非有一些长时间运行的东西阻止了返回事件循环。