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

Setting a breakpoint in pycharm changes the behavior of the code

这确实是一个 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() 显示文本

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

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

当 wx.ST_NO_AUTORESIZE 未设置 时,对标签的更改将导致调整小部件的大小,这通常会导致很快通过来自系统的自动绘画事件。当 wx.ST_NO_AUTORESIZE 设置为 时,不会发生调整大小,因此不会发生特定的绘制事件,并且小部件可能不会被重新绘制,直到下一次父项被重新绘制刷新或发生其他触发绘画事件的事情。

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