Seite 1 von 1

EVENTS miteinander verbinden. Falls evt1 dann evt2.

Verfasst: Sonntag 30. Oktober 2005, 20:28
von qweet
Hi,

Gibt es eine einfache Möglichkeit Events miteinander zu verknüpfen?
Ich würde gern NACH einem Tastendruck anfangen etwas zu malen.

Pseudo-code:

Code: Alles auswählen

if wx.EVT_CHAR == TRUE:
       wx.EVT_PAINT(self, self.OnPaint)
qweet

Verfasst: Montag 31. Oktober 2005, 09:35
von Gast
also prinzipiell wird durch ein Event nur eine Funktion aufgerufen, in deinem Fall OnPaint(). Man kann ja dann ohne Probleme aus dieser aufgerufenen Funktion eine weitere Funktion aufrufen.

Verfasst: Montag 31. Oktober 2005, 11:31
von qweet
Leider klappt das eben nicht ganz. :( Hab folgenden Code:

funktioniert, getestet

Code: Alles auswählen

import wx

class MyProgram:
	def __init__(self, panel):
		panel.Bind(wx.EVT_CHAR, self.KeyEvent)
		
	def KeyEvent(self, evt):
		print "hi"
	#	wx.EVT_PAINT(self, self.OnPaint)
	#	self.OnPaint()
		
	def OnPaint(self, event=None):
		dc = wx.PaintDC(panel)
		dc.Clear()

		dc.SetPen(wx.Pen("RED", 4))
		dc.DrawLine(0, 0, 10, 10)

		
app = wx.PySimpleApp()
frame = wx.Frame(None, -1, "Test")
panel = wx.Panel(frame)
MyProgram(panel)
frame.Show(True)
app.MainLoop()
Nach jedem Tastendruck wird "hi" ausgegeben. Läuft einwandfrei. Ich will jedoch nach jedem Tastendruck etwas malen.

Wenn ich
self.OnPaint
nicht als Kommentar setze kommt der Fehler:
wxPaintDC may be only created in EVT_PAINT Handler

Und wenn ich
wx.EVT_PAINT(self, self.OnPaint)
nicht als Kommentar schreibe kommt der Fehler:
MyProgram instance has no attribute 'Connect'

wie ließe es sich nun bewerkstelligen, dass das Ereignis eines Tastendrucks mit dem Ereignis des Malens verbunden wird? Ich mein, im Endeffekt ist das doch eine simple Sache, auf eine Eingabe des Benutzers soll eine grafische Reaktion erfolgen.

qweet

Verfasst: Montag 31. Oktober 2005, 12:02
von Francesco
Mit Refresh erzwingst du den Aufruf des EVT_PAINT handlers.
(OnPaint darf nur durch den EVT_PAINT handler aufgerufen werden).

Code: Alles auswählen


import wx

class MyProgram:
    def __init__(self, panel):
        panel.Bind(wx.EVT_CHAR, self.KeyEvent)
        panel.Bind(wx.EVT_PAINT, self.OnPaint) 
    def KeyEvent(self, evt):
        print "hi"
        panel.Refresh()
       
    def OnPaint(self, event=None):
        print "update"
        dc = wx.PaintDC(panel)
        dc.Clear()

        dc.SetPen(wx.Pen("RED", 4))
        dc.DrawLine(0, 0, 10, 10)

       
app = wx.PySimpleApp()
frame = wx.Frame(None, -1, "Test")
panel = wx.Panel(frame)
MyProgram(panel)
frame.Show(True)
app.MainLoop() 
Der Programmaufbau ist jedoch auch ein bisschen verwirrend.
Ich mein die Klasse MyProgram.
Ich würde das Panel ableiten (MyPanel) und da alles hineingeben.

Verfasst: Montag 31. Oktober 2005, 16:18
von qweet
Danke dir. Ich hab bei deinem Programm einfach noch eine Zeile umgeschrieben und dann hat es genau das gemacht, was ich wollte.

Nach jedem Tastendruck erst anfangen etwas zu malen.

Code: Alles auswählen

import wx

class MyProgram:
	def __init__(self, panel):
		panel.Bind(wx.EVT_CHAR, self.KeyEvent)
		
	def KeyEvent(self, evt):
		print "hi"
		panel.Bind(wx.EVT_PAINT, self.OnPaint)
		panel.Refresh()
	
	def OnPaint(self, event=None):
		print "update"
		dc = wx.PaintDC(panel)
		dc.Clear()
	
		dc.SetPen(wx.Pen("RED", 4))
		dc.DrawLine(0, 0, 10, 10)

       
app = wx.PySimpleApp()
frame = wx.Frame(None, -1, "Test")
panel = wx.Panel(frame)
MyProgram(panel)
frame.Show(True)
app.MainLoop()