[gelöst] wxPython erkennt EVT_LEFT_DOWN Event nicht

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Kegelkugel
User
Beiträge: 32
Registriert: Samstag 8. Januar 2011, 13:37
Wohnort: München
Kontaktdaten:

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.
Zuletzt geändert von Kegelkugel am Donnerstag 17. November 2011, 15:13, insgesamt 1-mal geändert.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Das kann nicht sein, bei mir funktioniert dein Beispiel einwandfrei.

Python 2.7.2
>>> wx.version()
'2.8.12.1 (gtk2-unicode)'
the more they change the more they stay the same
Kegelkugel
User
Beiträge: 32
Registriert: Samstag 8. Januar 2011, 13:37
Wohnort: München
Kontaktdaten:

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()
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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
the more they change the more they stay the same
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.
Kegelkugel
User
Beiträge: 32
Registriert: Samstag 8. Januar 2011, 13:37
Wohnort: München
Kontaktdaten:

Danke, jetzt klappt's! :-)
Danke auch für die Erklärung und den Tipp mit x, y!
Antworten