将wx小部件内容保存到文件中

时间:2009-12-09 17:33:03

标签: python wxpython wxwidgets

我在程序中使用BufferedPaintDC在事件上创建了不同的形状,如circle / rect等。现在我想在单击菜单选项中的saveas按钮时保存文件。为此我使用memoryDC并将内容保存为bmp文件。

def Saveas(自我,事件):

    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()

现在我的问题是如何在“c”上获取缓冲直流所绘制的东西,以便它们可以转换为图像?我希望我的问题很清楚。你可以看到我在“c”上绘制矩形并且正在转换为图像。但我想获得在ONPaint上创建的形状。我该如何提取?

由于

1 个答案:

答案 0 :(得分:0)

你所要求的是非常接近你想截取屏幕截图。虽然技术上抓住窗口当前看起来的副本与克隆OnPaint的功能并不相同,但它可能会为您完成工作。

如果它不起作用,请注意该技术,包括使用DC.Blit(),因为这些将是您使用的工具。

请参阅此wxpython-users mailing list post by Andrea Gavana了解图像抓取代码。

编辑:如果问题是因为您在EVT_PAINT处理程序中执行了所有绘图 ,那么您可能需要一种不同的技术。从不同的例程绘制所有内容到预先分配的缓冲区位图。在OnPaint中,这就是图像实际到达屏幕的方式,你不绘制,只需复制已经绘制的位图。缓冲位图在OnPaint调用之间持续存在(实际上基本上与OnPaint无关),因此您可以添加一个相当简单的Save()例程。有关将向您展示如何执行此操作的各种代码段,请参阅wxPyWiki DoubleBuffererDrawing页面。 (另请注意,这将是一个学习曲线,所以如果还不够,请寻求更多帮助。)