wxPython将文本绘制到现有位图或imag上

2024-05-16 06:45:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在一些文本中添加一个背景图像,我希望通过使用MemoryDC将文本写入图像,然后将其放入我的GridSizer中。在

一切都按我所希望的那样工作,除了我不能使用现有的图像来绘制文本,我必须创建一个新的,空的,位图,这对我来说是毫无意义的,因为它让我回到我开始的地方。在

这是我的代码,它在我的GridSizer中放置了一个白色框,上面画着文本:

    w, h = 150,64
    bmp = wx.EmptyBitmap(w,h)
    dc = wx.MemoryDC()
    dc.SelectObject(bmp)
    dc.Clear()
    text = 'whatever'
    tw, th = dc.GetTextExtent(text)
    dc.DrawText(text, (w-tw)/2, (h-th)/2)
    dc.SelectObject(wx.NullBitmap)
    output_bitmap = wx.StaticBitmap(self, -1, bmp)
    return output_bitmap

下面是更改为尝试使用现有图像的相同代码:

^{pr2}$

这将给出以下错误消息:

File "/home/user/projects/project/base.py", line 267, in online_indicator
dc.SelectObject(bmp)

File "/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode/wx/_gdi.py", line 4783, in SelectObject
return _gdi_.MemoryDC_SelectObject(*args, **kwargs)

TypeError: in method 'MemoryDC_SelectObject', expected argument 2 of type 'wxBitmap &'

我也试过用直流拉丝标签但那不能接受我的位图图像。在

编辑:

我可能快到了,开始用dc.DrawImageLabel公司,现在我可以画出图像文本,从我所能看到的来看,应该都能画出来,但由于某些原因它不能,这里是我的新代码:

绘制文本:

    png = wx.Image(location, wx.BITMAP_TYPE_PNG).ConvertToBitmap()
    want_bmp = wx.StaticBitmap(self, -1, bitmap = png, )
    w, h = 150,64
    bmp = wx.EmptyBitmap(w,h)
    dc = wx.MemoryDC()
    dc.SelectObject(bmp)
    dc.Clear()
    rect = bmp.GetRect()
    dc.DrawImageLabel(text='this',image=wx.NullBitmap, rect=rect, alignment=10)
    dc.SelectObject(wx.NullBitmap)
    output_bitmap = wx.StaticBitmap(self, -1, bmp)
    return output_bitmap

要绘制图像:

    png = wx.Image(location, wx.BITMAP_TYPE_PNG).ConvertToBitmap()
    want_bmp = wx.StaticBitmap(self, -1, bitmap = png, )
    w, h = 150,64
    bmp = wx.EmptyBitmap(w,h)
    dc = wx.MemoryDC()
    dc.SelectObject(bmp)
    dc.Clear()
    rect = bmp.GetRect()
    dc.DrawImageLabel(text='this',image=wx.Bitmap(location), rect=rect, alignment=10)
    dc.SelectObject(wx.NullBitmap)
    output_bitmap = wx.StaticBitmap(self, -1, bmp)
    return output_bitmap

Tags: textrect图像文本selfoutputreturndc
1条回答
网友
1楼 · 发布于 2024-05-16 06:45:17

MemoryDC使用位图,而不是StaticBitmap控件。在

此外,您可以直接加载位图,而不需要使用图像对象。在

bitmap = wx.Bitmap(location)
dc = wx.MemoryDC(bitmap)
text = 'whatever'
w, h = dc.GetSize()
tw, th = dc.GetTextExtent(text)
dc.DrawText(text, (w - tw) / 2, (h - th) / 2) #display text in center
del dc
control = wx.StaticBitmap(self, -1, bitmap)

相关问题 更多 >