Seite 1 von 1

Linien zeichen

Verfasst: Dienstag 11. Januar 2005, 18:43
von b.me
Hi Leute,
ich würd gern eine Linie auf ein Panel zeichnen lassen mit dem wxPaintDC Objekt und der DrawLine Funktion...wenn ich es so wie im folgenden Code mache, habe ich aber 100% Systemauslastung und kann das Programm nicht mehr beenden. Weiß jemand Hilfe? Vielen Dank

Code: Alles auswählen

from wxPython.wx import *
import time
import wx, random

VERSION = 'Rahmen, 1.0.20040223'


class CMyFrame(wxFrame):
    def __init__(self, parent, id, title):
        wxFrame.__init__(self, parent, id, title, wxPyDefaultPosition, wxSize(640, 480))

        # falls der Windowmanager das Fenster schliesst
        EVT_CLOSE(self, self.OnBeenden)
        
#--------------------------------------------------------------------------------------------
#--------------------------------------------------------------------------------------------
        #Panel
        self.panel = wxPanel(self, -1)

        #Handler fürs zeichnen lassen
        self.Bind(wx.EVT_PAINT, self.OnPaint)
        
        self.lines = self.makeRandomLines(2, 400, 300)
    
    def makeRandomLines(self, num, w, h):
        pnts = []

        for i in range(num):
            x1 = random.randint(0, w)
            y1 = random.randint(0, h)
            x2 = random.randint(0, w)
            y2 = random.randint(0, h)
            pnts.append( (x1,y1, x2,y2) )
    
        return pnts
        
    def zeichnen(self, dc):
        dc.BeginDrawing()
        dc.SetPen(wx.Pen("BLACK", 2))
        dc.DrawLineList(self.lines)
        dc.DrawLineList(self.lines, wx.Pen("RED", 2))
        dc.EndDrawing()
        
    def OnPaint(self, event):
        dc = wxPaintDC(self.panel)
        dc.Clear()
        self.zeichnen(dc)

#--------------------------------------------------------------------------------------------
#--------------------------------------------------------------------------------------------

    def OnBeenden(self, event):
        print 'beenden'
        self.Destroy()



class CMyApp(wxApp):
    def OnInit(self):
        frame = CMyFrame(None, -1, VERSION)
        frame.Show(True)
        return true


if __name__ == '__main__':
    app = CMyApp(0)
    app.MainLoop()

EDIT by mawe: code gegen python-tags getauscht

Verfasst: Dienstag 11. Januar 2005, 19:48
von mawe
Hi!

Das wird Dir nicht wirklich helfen, aber bei mir funktionierts einwandfrei.

Gruß, mawe

Verfasst: Mittwoch 12. Januar 2005, 11:57
von CM
Hoi b.me

Tut mir leid, ich kann zur Zeit keine Pythonsachen laufen lassen. Aber ich habe auch keinen Fehler gefunden, der mir ins Auge springt (und spekulieren will ich nicht).
Was mir in solchen Fällen geholfen hat, war den einen oder anderen print 'x'-Befehl einzubauen, um zu schauen wo genau der Interpreter strauchelt.

Wäre vielleicht eine Idee, wenn Du das auch machst und das Resultat hier beschreiben würdest.

Viel Erfolg,
Christian

Verfasst: Mittwoch 12. Januar 2005, 13:07
von Francesco
Hi, habe es probiert, tatsächlich 100%.

Dann (nach probieren) fand ich, dass das event auf DrFrame gebunden war.


self.panel.Bind(wx.EVT_PAINT, self.OnPaint)
sollte dann besser laufen :)


Warum bei DrFrame dauernt ein Paint event daherkommt, weiss ich auch
nicht (eventuell Robin Dunn :) => wxpython-user-list)

Verfasst: Donnerstag 13. Januar 2005, 16:45
von b.me
Hey Francesco, vielen Dank für die Lösung, ich haette glaube ich noch Jahre gebraucht, bis ich das rasubekommen haette. Wie gut, dass es Foren gibt. Es funktioniert nun einwandfrei...DANKE DANKE,,, ciao

Verfasst: Donnerstag 13. Januar 2005, 18:02
von Francesco_not_logged_in
b.me hat geschrieben:Hey Francesco, vielen Dank für die Lösung, ich haette glaube ich noch Jahre gebraucht, bis ich das rasubekommen haette. Wie gut, dass es Foren gibt. Es funktioniert nun einwandfrei...DANKE DANKE,,, ciao
Gern geschehen.

Ich hätte wahrscheinlich auch lange gesucht.

Ich gab einfach ein print in "onpaint" aus.
Da sah ich , dass es die ganze Zeit aufgerufen wurde,
was eigentlich nicht sein dürfte.

BTW: Irgendein Problem ist mit Firefox.
Obwohl ich mich eingeloggt habe, bin ich nicht wirklich eingeloggt.
Wenn ich dann die Cookies lösche, geht es dann wieder das nächste mal.

Verfasst: Donnerstag 13. Januar 2005, 18:13
von b.me
hum, das Problem tritt bei mir nicht auch, habe auch firefox...