python - wxPython 将文本绘制到现有位图或图像上

标签 python text wxpython draw

我正在尝试向一些文本添加背景图像,我希望通过使用 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

现在将相同的代码更改为尝试使用现有图像:

    png = wx.Image(location, wx.BITMAP_TYPE_PNG).ConvertToBitmap()
    bmp = wx.StaticBitmap(self, -1, bitmap = png, size=(150, 64))

    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

这给出了以下错误信息:

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.DrawLabel 但它不接受我的位图图像。

编辑:

我想我可能快到了,开始使用 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

最佳答案

MemoryDC 适用于 Bitmap,而不适用于 StaticBitmap 控件。

此外,您可以直接加载 Bitmap,无需使用 Image 对象。

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)

关于python - wxPython 将文本绘制到现有位图或图像上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20287152/

相关文章:

c# - 在c#中读取文本文件中的不同 block

python tkinter应用程序多行上相同的文本

python - 记事本每帧上关闭应用程序的 wxPython 按钮

python - wxPython 程序只显示灰屏

python - 合并 pandas groupBy 对象

python - 使用 HTTP 基本身份验证的 python Flask REST API 的安全性

python - 禁用文件的所有 Pylint 警告

python - 拆分列表并使用相同的分隔符重新加入它

Java正则表达式从txt文件输入

python - 如何使文本适合 wxPython 网格中的单元格?