将wx控件内容保存到文件

1 投票
1 回答
513 浏览
提问于 2025-04-15 16:50

我在程序中使用BufferedPaintDC创建了不同的形状,比如圆形和矩形等。现在,我想在菜单中点击“另存为”按钮时保存文件。为此,我使用了memoryDC,并将内容保存为bmp文件。

def Saveas(self,event):

    dlg = wx.FileDialog(self, "Choose a file", self.dirname, "", "*.*", \
    wx.SAVE | wx.OVERWRITE_PROMPT)
    if dlg.ShowModal() == wx.ID_OK:   # user enters filename as something.bmp
     self.show_bmp = wx.StaticBitmap(self)

     w, h = self.GetClientSize()

     draw_bmp = wx.EmptyBitmap(w, h)

     c = wx.MemoryDC(draw_bmp)

     c.SetBrush(wx.Brush('white'))

     c.Clear()

     c.SetPen(wx.Pen("purple", 15))

     c.DrawRectangle(30,30,60,60)   ### ??????####

     myimage = self.show_bmp.GetBitmap()
     self.filename=dlg.GetFilename()
     name = os.path.join('C:\mad', self.filename)
     myimage.SaveFile(name, wx.BITMAP_TYPE_JPEG)
     self.filename=name
    dlg.Destroy()

现在我的问题是,如何获取Buffered DC上绘制的内容到“c”上,这样它们就可以转换成图片?我希望我的问题表达得很清楚。正如你所看到的,我在“c”上绘制了矩形,并且它被转换成了图片。但我想获取在ONPaint中创建的形状。我该如何提取这些内容呢?

谢谢

1 个回答

0

你问的问题其实很像是在说你想要截个屏。虽然从技术上讲,抓取当前窗口的样子和复制 OnPaint 的内容并不是一回事,但这可能能满足你的需求。

如果这样做不行,可以记住这个方法,包括使用 DC.Blit(),这些都是你需要用到的工具。

你可以查看这个 wxpython-users 邮件列表中 Andrea Gavana 的帖子,里面有抓取图像的代码。

编辑:如果问题出在你所有的绘图都是在 EVT_PAINT 处理程序里面进行的,那么你可能需要换个方法。你应该从一个不同的程序绘制所有内容到一个预先分配的缓冲位图中。在 OnPaint 里面,也就是图像真正显示到屏幕上的地方,你不需要再绘制,只需复制已经绘制好的位图。这个缓冲位图在 OnPaint 调用之间是持续存在的(实际上和 OnPaint 基本上是独立的),所以你可以添加一个简单的 Save() 方法。可以查看 wxPyWiki DoubleBuffererDrawing 页面,里面有各种代码片段可以教你怎么做。(另外要注意,这可能需要一些学习时间,如果不够清楚,可以再问更多问题。)

撰写回答