Linien zeichen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
b.me
User
Beiträge: 17
Registriert: Donnerstag 4. März 2004, 16:25

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
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

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

Gruß, mawe
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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

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)
b.me
User
Beiträge: 17
Registriert: Donnerstag 4. März 2004, 16:25

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
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.
b.me
User
Beiträge: 17
Registriert: Donnerstag 4. März 2004, 16:25

hum, das Problem tritt bei mir nicht auch, habe auch firefox...
Antworten