ich hab nun das Beispielprogramm Sketch genau abgetippt und mehrmals kontroliert. Sieht alles komplett gleich aus.
Wenn man nun beginnt mit zeichnen und den Mauszeiger bewegt erhält man einen Stern von der ersten Position aus. Es sollte jedoch so sein das man frei zeichnen kann.
Kann mir jemand helfen?
Gruss Michael
Hier die Fehlermeldung:
Traceback (most recent call last):
File "E:\PyTutFiles\sketchWindow.py", line 53, in OnMotion
dc = wx.BufferedDC(wx.ClientDC(self), self.buffer)
File "C:\Python24\Lib\site-packages\wx-2.6-msw-unicode\wx\_gdi.py", line 4326, in __init__
newobj = _gdi_.new_BufferedDC(*args)
wx._core.PyAssertionError: C++ assertion "wxAssertFailure" failed in ..\..\src\msw\dcmemory.cpp(133): Couldn't select a bitmap into wxMemoryDC
Traceback (most recent call last):
File "E:\PyTutFiles\sketchWindow.py", line 54, in OnMotion
self.drawMotion(dc, event)
File "E:\PyTutFiles\sketchWindow.py", line 63, in drawMotion
self.pos = NewPos
NameError: global name 'NewPos' is not defined
Und hier der Code:
Code: Alles auswählen
import wx
class SketchWindow(wx.Window):
def __init__(self, parent, ID):
wx.Window.__init__(self, parent, ID)
self.SetBackgroundColour("White")
self.color = "Black"
self.thickness = 1
self.pen = wx.Pen(self.color, self.thickness, wx.SOLID)
self.lines = []
self.curLine = []
self.pos = (0, 0)
self.InitBuffer()
self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
self.Bind(wx.EVT_MOTION, self.OnMotion)
self.Bind(wx.EVT_SIZE, self.OnSize)
self.Bind(wx.EVT_IDLE, self.OnIdle)
self.Bind(wx.EVT_PAINT, self.OnPaint)
def InitBuffer(self):
size = self.GetClientSize()
self.buffer = wx.EmptyBitmap(size.width, size.height)
dc = wx.BufferedDC(None, self.buffer)
dc.SetBackground(wx.Brush(self.GetBackgroundColour()))
dc.Clear()
self.DrawLines(dc)
self.reInitBuffer = False
def GetLinesData(self):
return self.lines[:]
def SetLinesData(self, lines):
self.lines = lines[:]
self.InitBuffer()
self.Refresh()
def OnLeftDown(self, event):
self.curLine = []
self.pos = event.GetPositionTuple()
self.CaptureMouse()
def OnLeftUp(self, event):
if self.HasCapture():
self.lines.append((self.color,
self.thickness,
self.curLine))
self.curLine = []
self.ReleaseMouse()
def OnMotion(self, event):
if event.Dragging() and event.LeftIsDown():
dc = wx.BufferedDC(wx.ClientDC(self), self.buffer)
self.drawMotion(dc, event)
event.Skip()
def drawMotion(self, dc, event):
dc.SetPen(self.pen)
newPos = event.GetPositionTuple()
coords = self.pos + newPos
self.curLine.append(coords)
dc.DrawLine(*coords)
self.pos = NewPos
def OnSize(self, event):
self.reInitBuffer = True
def OnIdle(self, event):
if self.reInitBuffer:
self.InitBuffer()
self.Refresh(False)
def OnPaint(self, event):
dc = wx.BufferedPaintDC(self, self.buffer)
def DrawLines(self, dc):
for colour, thickness, line in self.lines:
pen = wx.Pen(colour, thickness, ex.SOLID)
dc.SetPen(pen)
for coords in line:
dc.DrawLine(*coords)
def SetColor(self, color):
self.color = color
self.pen = wx.Pen(self.color, self.thickness, wx.SOLID)
def SetThickness(self, num):
self.thickness = num
self.pen = wx.Pen(self.color, self.thickness, wx.SOLID)
class SketchFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, "Sketch Frame", size = (800, 600))
self.sketch = SketchWindow(self, -1)
if __name__ == '__main__':
app = wx.PySimpleApp()
frame = SketchFrame(None)
frame.Show(True)
app.MainLoop()