【问题标题】:Setting a breakpoint in pycharm changes the behavior of the code在 pycharm 中设置断点会改变代码的行为
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 奇怪的是,在调试器中触发了绘制事件 is - 但您的解释至少提供了一些启示 - 显然调试器中的某些东西 hocus pocus 触发了这样一个事件,而在正常执行中不是 - 关闭编辑:现在我想它是微不足道的 ahahaha - 断点将焦点切换到 IDE - 然后回到程序 -> 绘画 - rolfmao
猜你喜欢
  • 1970-01-01
  • 2017-04-26
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
  • 2020-07-23
  • 2011-04-26
相关资源
最近更新 更多