EVENTS miteinander verbinden. Falls evt1 dann evt2.

Plattformunabhängige GUIs mit wxWidgets.
Antworten
qweet
User
Beiträge: 119
Registriert: Freitag 2. September 2005, 21:26

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
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.
qweet
User
Beiträge: 119
Registriert: Freitag 2. September 2005, 21:26

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

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.
qweet
User
Beiträge: 119
Registriert: Freitag 2. September 2005, 21:26

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()
Antworten