Seite 1 von 1

[gelöst] wxPython erkennt EVT_LEFT_DOWN Event nicht

Verfasst: Mittwoch 16. November 2011, 18:07
von Kegelkugel
Hallo,

ich möchte gerade ein kleines Mal-Programm schreiben, das da Punkte mahlt, wo man mit gedrückter linker Maustaste den Curosr hinbewegt:

Code: Alles auswählen

class EditorWindow(wx.Frame):
	def __init__(self, parent):
		self.dots = []

		wx.Frame.__init__(self, parent, -1, 'Editor', size = (210*3, 297*3+65))
		self.Bind(wx.EVT_CLOSE, self.OnClose)
		self.Bind(wx.EVT_LEFT_DOWN, self.OnClick)
		self.SetBackgroundColour('white')
		self.Centre()

		toolbar = self.CreateToolBar()
		save = toolbar.AddLabelTool(wx.ID_ANY, '', wx.Bitmap('data/images/save.png'))
		toolbar.Realize()

		DrawDots(self, self.dots)

		self.Show(True)

	def OnClose(self, event):
                self.Destroy()
		print self.dots

	def OnClick(self, event):
		print "click"
		self.dots.append(event.GetPosition())
Leider wird OnClick nie ausgelöst!
Kann mir jemand vielleicht sagen, wo mein Fehler liegt und wie ich es besser machen kann?
Anmerkung: Objekte der Klasse EditorWindow werden von einem Hauptfenster erstellt, welches dann "parent" ist.

Danke!

Grüße,
kegelkugel

P.S.: Das gleich hab' ich bereits in Pygame geschrieben, da klappt es. Wenn ich einfach das pygame Programm mit den pygame-Events nehmen könnte, und darüber eine Toolbar von wxPython legen könnte, wäre mir auch geholfen.

Re: wxPython erkennt EVT_LEFT_DOWN Event nicht

Verfasst: Mittwoch 16. November 2011, 19:45
von Dav1d
Das kann nicht sein, bei mir funktioniert dein Beispiel einwandfrei.

Python 2.7.2
>>> wx.version()
'2.8.12.1 (gtk2-unicode)'

Re: wxPython erkennt EVT_LEFT_DOWN Event nicht

Verfasst: Mittwoch 16. November 2011, 19:50
von Kegelkugel
Danke für die Antwort!

ebenfalls Python 2.7.2

wx Version: '2.8.11.0 (gtk2-unicode)'

Das ist der gesamte Quellcode, den ich jetzt ausgeführt hab':

Code: Alles auswählen

import wx

class EditorWindow(wx.Frame):
        def __init__(self, parent):
                self.dots = []

                wx.Frame.__init__(self, parent, -1, 'Editor', size = (210*3, 297*3+65))
                self.Bind(wx.EVT_CLOSE, self.OnClose)
                self.Bind(wx.EVT_LEFT_DOWN, self.OnClick)
                self.SetBackgroundColour('white')
                self.Centre()

                toolbar = self.CreateToolBar()
                save = toolbar.AddLabelTool(wx.ID_ANY, '', wx.Bitmap('data/images/save.png'))
                toolbar.Realize()

                DrawDots(self, self.dots)

                self.Show(True)

        def OnClose(self, event):
                self.Destroy()
                print self.dots

        def OnClick(self, event):
                print "click"
                self.dots.append(event.GetPosition())

class DrawDots(wx.Window):
	def __init__(self, parent, dots):
		wx.Window.__init__(self, parent)
		self.Bind(wx.EVT_PAINT, self.OnPaint)
		self.dots = dots

	def OnPaint(self, event):
		dc = wx.PaintDC(self)
		dc.Clear()
		for dot in self.dots:
			dc.DrawPoint(dot[0], dot[1])		# x, y Wert

app = wx.App()
mw = EditorWindow(None)
app.MainLoop()

Re: wxPython erkennt EVT_LEFT_DOWN Event nicht

Verfasst: Mittwoch 16. November 2011, 20:21
von Dav1d
Das ist in der Tat komisch, DrawDots scheint i-wie die Events zu verschlucken, allerdings brauchst du (so weit ich das erkennen kann) DrawDots nicht als extra Klasse. Eine "Lösung" von driscollis aus dem wxPython IRC-Channel:

Code: Alles auswählen

import wx

class EditorWindow(wx.Frame):
        def __init__(self, parent):
                self.dots = []

                wx.Frame.__init__(self, parent, -1, 'Editor', size = (210*3, 297*3+65))
                self.Bind(wx.EVT_CLOSE, self.OnClose)
                self.Bind(wx.EVT_LEFT_DOWN, self.OnClick)
                self.SetBackgroundColour('white')
                self.Centre()

                #toolbar = self.CreateToolBar()
                #save = toolbar.AddLabelTool(wx.ID_ANY, '', wx.Bitmap('data/images/save.png'))
                #toolbar.Realize()

                self.Bind(wx.EVT_PAINT, self.OnPaint)

                self.Show(True)

        def OnClose(self, event):
                self.Destroy()
                print self.dots

        def OnClick(self, event):
                print "click"
                self.dots.append(event.GetPosition())
                
        def OnPaint(self, event):
                print "painting"
                dc = wx.PaintDC(self)
                dc.Clear()
                for dot in self.dots:
                        dc.DrawPoint(dot[0], dot[1])            # x, y Wert
                        
                event.Skip()

app = wx.App()
mw = EditorWindow(None)
app.MainLoop()
//Edit: event.Skip ist nicht nötig und die toolbar ist nur auskommentiert, weil wir das Bild nicht haben

Re: wxPython erkennt EVT_LEFT_DOWN Event nicht

Verfasst: Mittwoch 16. November 2011, 20:39
von BlackJack
Hat nichts mit dem Problem zu tun aber bei der ``for dot in self.dots:``-Schleife könnte man sich den Kommentar und etwas Tipparbeit in der folgenden Zeile sparen wenn man ``for x, y in self.dots:`` schreibt.

Edit: Zum eigentlichen Problem: Das `DrawDots`-Exemplar füllt den Frame aus und damit ist es auch *dieses* Objekt welches die Maus-Ereignisse bekommt. Der `Frame` ist ja sozusagen „dahinter“ und deshalb ist da auch keine Fläche vom `Frame` auf die man klicken könnte.

Re: wxPython erkennt EVT_LEFT_DOWN Event nicht

Verfasst: Donnerstag 17. November 2011, 15:13
von Kegelkugel
Danke, jetzt klappt's! :-)
Danke auch für die Erklärung und den Tipp mit x, y!