如何在wxPanel上绘制的wxPython中将图像保存或打印到文件中

如何在wxPanel上绘制的wxPython中将图像保存或打印到文件中,wxpython,Wxpython,我正在使用wxPython和一个wx.Panel,我将在上面绘制一个图表 例如,假设我有一个wxPanel的OnPaint事件,其中包含: def OnPaint(self, e): dc = wx.PaintDC(self) dc.DrawLine(50, 60, 190, 60) 绘制完成后,用户希望将图像保存到一个文件中,在wxPython中实现这一点的方法是什么?在其他框架中,我有一个通用的绘图方法,我会将不同的画布传递给该方法,例如位图画布、屏幕画布或打印画布,以便

我正在使用wxPython和一个wx.Panel,我将在上面绘制一个图表

例如,假设我有一个wxPanel的OnPaint事件,其中包含:

def OnPaint(self, e):

    dc = wx.PaintDC(self)
    dc.DrawLine(50, 60, 190, 60)
绘制完成后,用户希望将图像保存到一个文件中,在wxPython中实现这一点的方法是什么?在其他框架中,我有一个通用的绘图方法,我会将不同的画布传递给该方法,例如位图画布、屏幕画布或打印画布,以便我可以在这些不同的情况下使用相同的绘图代码。搜索之后,我还没有看到wxPython的任何类似情况。我想象着这样写:

def drawMe (dc):
    dc.DrawLine(50, 60, 190, 60)

def OnPaint (self, evt):
    dc = wx.PaintDC(self)
    drawMe (dc)  

def ExportToImage (self)
    dc = ImageDc 
    drawMe (dc)
    saveToFile (dc.getImage()  
   

有什么建议吗?

进一步的研究和一些实验揭示了答案。我从设置了面板等的人那里获取了一些基本代码,然后对其进行了修改,以处理从屏幕到屏幕的绘图以及从位图到可以保存到文件的绘图。这是代码。单击该按钮可将同一图像绘制到保存到文件的位图中

import wx

# Core code taken from:

# https://stackoverflow.com/questions/25756896/drawing-to-panel-inside-of-frame-in-wxpython

# OnButton, drawMe added and OnPaint modified
# tested on wxPython 2.8.11.0, Python 2.7.1+, Ubuntu 11.04
# http://stackoverflow.com/questions/2053268/side-effects-of-handling-evt-paint-event-in-wxpython
# http://stackoverflow.com/questions/25756896/drawing-to-panel-inside-of-frame-in-wxpython
# http://www.infinity77.net/pycon/tutorial/pyar/wxpython.html
# also, see: wx-2.8-gtk2-unicode/wx/lib/agw/buttonpanel.py

class MyPanel(wx.Panel):

 def drawMe (self, dc):
   dc.SetBackground(wx.Brush(wx.BLACK))
   dc.Clear()
   dc.SetPen(wx.Pen("white", 3))
   dc.DrawLine(10, 10, 60, 60)

 def __init__(self, parent, id=wx.ID_ANY, pos=(500,500), size=wx.DefaultSize, style=0, name="MyPanel"):

   super(MyPanel, self).__init__(parent, id, pos, size, style, name)

   button = wx.Button(self, wx.ID_ANY, 'Draw', (10, 80)) 
   button.Bind(wx.EVT_BUTTON, self.OnButton) 

   self.Bind(wx.EVT_PAINT, self.OnPaint)

 # Draw the same image to a bitmap
 def OnButton (self, event):
     width = 200; height = 200
     bmp = wx.Bitmap(width, height)
     dc = wx.MemoryDC ()
     dc.SelectObject(bmp)
     self.drawMe (dc)
     bmp.SaveFile ("image.bmp", wx.BITMAP_TYPE_BMP)

 def OnPaint(self, event):
   dc = wx.PaintDC(self) 
   self.drawMe (dc)

class MyFrame(wx.Frame):
   def __init__(self, parent):
    wx.Frame.__init__(self, parent, -1, "Custom Panel Demo", pos=(750,500))
    self.SetSize((300, 200))
    self.panel = MyPanel(self)
    self.panel.SetBackgroundColour(wx.Colour(255,255,255))
    self.panel.SetForegroundColour(wx.Colour(50,50,50))
    sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
    sizer_1.Add(self.panel, 1, wx.EXPAND | wx.ALL, 0)
    self.SetSizer(sizer_1)
    self.Layout()

app = wx.App(0)
frame = MyFrame(None)
app.SetTopWindow(frame)
frame.Show()
app.MainLoop()