需要帮助在wxPython中使用self.MemoryDC

问题描述:

我试图制作一个双缓冲自定义文本小部件(为了避免闪烁)。 但是,我希望能够做一些事情。然而,我不确定我应该使用的确切方法。需要帮助在wxPython中使用self.MemoryDC

前两个很容易我只是想改变背景和前景色。

所以或多或少我希望能够在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) 

我不明白你在创建后配置self.Text的意思。如果你想在绘制后改变文字 - 你不能。一旦你将它提交给DC,它就在那里,而改变它的唯一方法就是清除DC并重新绘制它。就你而言,当文本更新时你似乎需要做的就是再次调用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) 
+0

是的,我的意思是改变文本的能力。我是wxPython的新手,所以我仍然试图弄清它的来龙去脉。根据我的理解,** wx.MemoryDC()**可以像Tkinter Canvas小部件一样工作。您可以在该特定的小部件上配置文本,而无需重新绘制它。谢谢! – rectangletangle 2011-05-14 09:31:23