Seite 1 von 1

Problem mit wx.EVT_PAINT

Verfasst: Dienstag 13. Mai 2008, 20:22
von Batt0sa1
Hi,

ich hab folgendes Problem:
Wenn ich ein Fenster mit Srich zeichnen will, kann ich die Breie nicht mit Übergabewerten festlegen. :(

So wie ich es sehe, liegt es an wx.EVT_PAINT...
Da ich aber keine Doku, Erklärung oder ähnliches dazu gefunden hab, bin ich langsam mit den Nerven am Ende :?

Codebsp.:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import wx

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import wx

class DrawPanel(wx.Panel):
 
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1)
        self.SetBackgroundColour("WHITE")
        wx.EVT_PAINT(self, self.OnPaint)

    def OnPaint(self, event=None):
        dc = wx.PaintDC(self)
        dc.Clear()
        dc.SetPen(wx.Pen("BLACK", 4))
        dc.DrawLine(0, 0, 200, 200)
        print "Test ok"


app = wx.PySimpleApp(False)

frame = wx.Frame(None, -1, "TestSankey", size=(200, 200))
DrawPanel(frame)
frame.Show(True)
app.MainLoop()
Das funktioniert soweit super...
Problematisch wird es erst so:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import wx

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import wx

class DrawPanel(wx.Panel):
 
    def __init__(self, parent):
        x=4
        wx.Panel.__init__(self, parent, -1)
        self.SetBackgroundColour("WHITE")
        wx.EVT_PAINT(self, self.OnPaint(x))

    def OnPaint(self, x, event=None):
        dc = wx.PaintDC(self)
        dc.Clear()
        dc.SetPen(wx.Pen("BLACK", x))
        dc.DrawLine(0, 0, 200, 200)
        print "Test ok"


app = wx.PySimpleApp(False)

frame = wx.Frame(None, -1, "TestSankey", size=(200, 200))
DrawPanel(frame)
frame.Show(True)
app.MainLoop()

In dem Moment wo ich einen Übergabewert habe, krieg ich nur noch nen weißen Schirm :evil:
Ich weiß echt keinen Ansatzpunkt mehr...
Tipps kämen mir sehr gelegen 8)

Re: Problem mit wx.EVT_PAINT

Verfasst: Dienstag 13. Mai 2008, 22:12
von gerold
Hallo Batt0sa1!

Ein Event-Handler bekommte immer nur das "Event" als Objekt übergeben. Mehr oder weniger geht nicht. Du kannst also an die Funktion "OnPaint" nichts übergeben. Wenn du die Strichstärke ändern möchtest, dann könntest du diese an die Instanz binden.

Code: Alles auswählen

    self.strichstaerke = 10
    ...

def on_paint(self, event)
    ...
    dc.SetPen(wx.Pen("BLACK", self.strichstaerke))
    ...
mfg
Gerold
:-)

Verfasst: Dienstag 13. Mai 2008, 22:51
von Batt0sa1
Ich könnt dich knutschen :D
Weißt du wie lange ich daran rumgefummelt habe :?: :!:

Das is genau das was ich gesucht habe...
Hab es mal eingefügt und funzt super :shock:

Was ich nur nicht verstehe ist, warum ich dem Event nicht noch Werte mitgeben kann? Hat das 'ne besondere Begründung?

Auf jeden Fall ganz großen Dank ^^

Verfasst: Dienstag 13. Mai 2008, 23:33
von gerold
Batt0sa1 hat geschrieben:Was ich nur nicht verstehe ist, warum ich dem Event nicht noch Werte mitgeben kann? Hat das 'ne besondere Begründung?
Hallo Batt0sa1!

Das wxPython-Eventsystem ist sehr flexibel. Aber um zu verstehen, warum man keine zusätzlichen Parameter übergeben kann, muss man das Event-System verstehen.

In groben Zügen läuft es so. Es gibt intern First-In/First-Out Listen für die verschiedensten Event-Prioritäten. Diese werden in der Main-Loop ständig kontrolliert. Und sobald dort ein Event auftaucht, wird das Event an den ersten, für das Event gemeldeten (=Bind) Event-Handler (=Funktionen) weitergereicht.

Events sind ganz normale Klasseninstanzen mit vorgegebenen Eigenschaften. Und solche Events können von überall her kommen. Und das einzige was man ausmachen kann ist, dass ein Event-Handler eine Funktion ist, welche als einzigen Parameter (ausgenommen self) das Event-Objekt übermittelt bekommt. Man meldet also mit ``Bind`` einen Event-Handler am Event-System von wxPython an und reiht sich somit an die bereits registrierten Event-Handler an.

Funktionen die Events auslösen, haben die Möglichkeit, zusätzliche Attribute an das Event-Objekt anzuhängen. Das ist möglich, da Events ganz normale Klasseninstanzen sind. So ist es sehr wohl möglich, Daten direkt an die Event-Handler zu übergeben. Die Daten müssen aber vom Auslöser des Events kommen. Und beim PAINT-Event hast du keinen Einfluss auf den Auslöser.

Indirekt könnte man verschiedene Funktionen an die Events binden, die indirekt jeweils andere Parameter verwenden. Das kann man auch mit ``lambda event: andere_funktion(event, "hallo")`` erreichen. Aber das ist ein Thema für später.

Und so weiter und so fort...

Ich muss jetzt Schluss machen und hoffe, dass ich dich damit nicht zu sehr verwirrt habe. ;-)

mfg
Gerold
:-)