对现有的 wxPython 控件进行少量添加

Making small additions to an existing wxPython control

我正在尝试获取现有 wxPython 控件的行为并简单地在其上绘制一些图形。

下面的代码显示了我当前的尝试。如果我实例化 StaticTextUnderline 而不是 wx.StaticText,它的行为完美,前者的行为与后者完全相同。换句话说,控件中显示的完全相同的文本(一段 20 行×20 个字符的乱码文本):

import wx

class StaticTextUnderline(wx.StaticText): 
    def __init__(self, parent, *args):
        super(StaticTextUnderline, self).__init__(parent, *args)
        self.Bind(wx.EVT_PAINT, self.OnPaint)
        
    def OnPaint(self, e):
        super(StaticTextUnderline, self).Update()
        # dc = wx.PaintDC(self)
        # pen = wx.Pen(wx.Colour(255,0,0))
        # pen.SetWidth(1)
        # dc.SetPen(pen) 
        # dc.DrawLine(0, 0, 50, 50) 

注释代码的目的是在绘制静态文本后在文本上简单地绘制一条红线。不幸的是,instant 我取消了第一行的注释,控件不再呈现文本。我怀疑 获取另一个设备上下文可能会清除当前内容。如果我取消所有注释,我会看到红线,但如果底层静态文本已以某种方式被清除,这对我没有好处。

如何拦截任意 wxPython 控件并在其完成工作后仅 fiddle 包含内容?

好的,看起来最初的想法(第二个绘制设备上下文可能导致问题)是正确的。在最初尝试弄清楚如何获取 one 上下文并将其用于超类调用和 OnPaint 调用之后,事实证明您可以通过获取不同类型的设备上下文(一个客户端)。

文档中有关于在绘画事件中使用非绘画上下文(以及绘画事件之外的绘画上下文)的警告,但我怀疑这与 first 获得上下文。

所以下面的代码似乎可以工作,渲染基础文本 红线:

def OnPaint(self, e):
    super(StaticTextUnderline, self).Update()
    dc = wx.ClientDC(self)
    pen = wx.Pen(wx.Colour(255,0,0))
    pen.SetWidth(1)
    dc.SetPen(pen) 
    dc.DrawLine(0, 0, 50, 50)