Seite 1 von 1

Sketch Programm auf wxPython in Action

Verfasst: Mittwoch 31. Mai 2006, 07:41
von de_master
Hi @ all,
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()

Re: Sketch Programm auf wxPython in Action

Verfasst: Mittwoch 31. Mai 2006, 07:55
von gerold
de_master hat geschrieben:

Code: Alles auswählen

 File "E:\PyTutFiles\sketchWindow.py", line 63, in drawMotion
    self.pos = NewPos
NameError: global name 'NewPos' is not defined
Hi de_master!

Den Rest des Programmes habe ich mir nicht angesehen, aber zumindest darauf kann ich dich hinweisen:
NewPos != newPos

mfg
Gerold
:-)

Verfasst: Mittwoch 31. Mai 2006, 09:13
von de_master
Danke. Wenns nicht immer diese Kleinigkeiten wären :(

Re: Sketch Programm auf wxPython in Action

Verfasst: Mittwoch 31. Mai 2006, 14:12
von nikgid
de_master hat geschrieben:Hi @ all,
ich hab nun das Beispielprogramm Sketch genau abgetippt und mehrmals kontroliert. Sieht alles komplett gleich aus.
Nur für den Fall, dass du es nicht wusstest. Du kannst dir den source-code aller Beispiele des Buches "wxPython in action" von der Website des Manning-Verlages downloaden: http://www.manning-source.com/books/rap ... in_src.zip

Das hilft auf jeden Fall auch gegen Tippfehler ;-)

Niklas

Re: Sketch Programm auf wxPython in Action

Verfasst: Mittwoch 31. Mai 2006, 15:01
von Francesco
nikgid hat geschrieben:
Nur für den Fall, dass du es nicht wusstest. Du kannst dir den source-code aller Beispiele des Buches "wxPython in action" von der Website des Manning-Verlages downloaden: http://www.manning-source.com/books/rap ... in_src.zip

Das hilft auf jeden Fall auch gegen Tippfehler ;-)

Niklas
Ja warum sich die Arbeit antun?
Siehe auch:

http://www.python-forum.de/topic-6114.html

Verfasst: Donnerstag 1. Juni 2006, 12:02
von de_master
Na ja nur zur Übung :) Denke wenn mans tippt prägt es sich schneller ein.