在 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 到事件循环。
这确实是一个 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 到事件循环。