代码之家  ›  专栏  ›  技术社区  ›  Mr_and_Mrs_D

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

  •  0
  • Mr_and_Mrs_D  · 技术社区  · 10 年前

    这确实是一个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'' -因此没有显示文本。所以这是一个普通的老bug。

    问题仍然存在 为什么在调试器中设置断点 self.raceText.SetLabel() 显示文本 ?

    编辑:一定要阅读答案-健康检查

    1 回复  |  直到 10 年前
        1
  •  0
  •   RobinDunn    10 年前

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

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

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