需要在wxPython中处理self.MemoryDC的帮助

2 投票
1 回答
593 浏览
提问于 2025-04-16 17:37

我正在尝试制作一个自定义的文本小部件,这个小部件使用双缓冲技术(这样可以避免闪烁)。不过,我想实现一些功能,但不太确定应该用哪些具体的方法。

前两个功能比较简单,我只是想改变背景色和前景色。

所以大致上,我想在self.Draw()里改变self.Text的文本颜色。

代码片段:

self.Text = mdc.DrawText(self.TextString, 10, 0) 

还有就是想改变self.MemoryDC的背景(填充)颜色。

接下来,有人知道我怎么才能把self.Text居中吗?最后,创建完self.Text后,我该怎么配置它?

到目前为止的小部件:

class DynamicText (wx.Panel):
    def __init__(self, par):
        self.Par = par

        wx.Panel.__init__(self, self.Par)


        self.Time = Time(self, func=self.SetTime)



        self.Dim = self.Par.GetClientSize()
        self.SetSize(self.Dim)

        self.Bind(wx.EVT_SIZE, self.Resize)
        self.Bind(wx.EVT_ERASE_BACKGROUND, self.Erase)
        self.Bind(wx.EVT_PAINT, self.Paint)

    def Set (self, text) :
        self.TextString = text

    def SetTime (self, time) :
        self.Set(str(time))
        self.Resize(None)

    def Resize(self, event):

        self.Width, self.Height = self.GetSize()

        bitmap = wx.EmptyBitmap(self.Width, self.Height)

        self.MemoryDC = wx.MemoryDC(bitmap)

        ''' Redraws **self.MemoryDC** '''
        mdc = self.MemoryDC

        ''' Deletes everything from widget. '''
        mdc.Clear()


        fs = 11
        font = wx.Font( fs, wx.DEFAULT, wx.NORMAL, wx.NORMAL)
        mdc.SetFont(font)

        self.Draw()

        self.Refresh()



    def Draw (self) :
        mdc = self.MemoryDC
        self.Text = mdc.DrawText(self.TextString, 10, 0)

    def Erase(self, event):
        ''' Does nothing, as to avoid flicker. '''
        pass

    def Paint(self, event):
        pdc = wx.PaintDC(self)
        w, h = self.MemoryDC.GetSize()
        pdc.Blit(0, 0, w, h, self.MemoryDC, 0, 0)

1 个回答

1

我不太明白你说的在创建后配置self.Text是什么意思。如果你想在绘制之后更改文本,那是不行的。一旦你把它画到显示设备上,它就固定在那里了,唯一能做的就是清空显示设备,然后重新绘制。在你的情况下,当文本更新时,你只需要再次调用Resize(),这样就会强制重新绘制。需要注意的是,DrawText() 不会返回任何值,所以你的 self.Text 的值会是 None。你绝对不能用 这个 来指代已经绘制的文本。:D

至于其他的,这里有一个Draw()方法的例子,它可以把文本居中并涂成蓝色:

def Draw(self) :
    mdc = self.MemoryDC
    dc_width, dc_height = mdc.GetSizeTuple()
    text_width, text_height, descent, externalLeading = mdc.GetFullTextExtent(self.TextString)
    x = (dc_width  - text_width)  / 2
    y = (dc_height - text_height) / 2
    mdc.SetTextForeground('Blue')
    mdc.DrawText(self.TextString, x, y)

撰写回答