Sketch Programm auf wxPython in Action

Plattformunabhängige GUIs mit wxWidgets.
Antworten
de_master
User
Beiträge: 72
Registriert: Samstag 15. Januar 2005, 15:19

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()
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
de_master
User
Beiträge: 72
Registriert: Samstag 15. Januar 2005, 15:19

Danke. Wenns nicht immer diese Kleinigkeiten wären :(
nikgid
User
Beiträge: 1
Registriert: Mittwoch 31. Mai 2006, 14:09

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
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

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
de_master
User
Beiträge: 72
Registriert: Samstag 15. Januar 2005, 15:19

Na ja nur zur Übung :) Denke wenn mans tippt prägt es sich schneller ein.
Antworten