Seite 1 von 1

Maus Event wird unter Toolbar-Icon nicht erkannt

Verfasst: Freitag 25. November 2011, 16:01
von Kegelkugel
Hallo,

ich habe folgendes Problem: ich hab' eine Toolbar mit einem Icon. Direkt unter dem Icon werden keine Maus-Events erkannt (weder EVT_LEFT_DOWN, noch EVT_LEFT_UP oder MOTION). Hier ein Screenshot, in dem man sieht, wo die Maus noch erkannt wird, und wo nicht mehr: http://www.kegelkugel.bplaced.de/data/H ... Fehler.png
Der "Fehler" tritt nur auf, wenn ich ein Icon bzw. eine Toolbar dort habe und dann nur dort.
Kann mir jemand helfen oder kennt das Problem?
Danke!

Grüße,
kegelkugel

Re: Event LEFT DOWN wird unter Toolbar-Icon nicht erkannt

Verfasst: Freitag 25. November 2011, 17:29
von Kegelkugel
Hier noch der Quell-Code:

Code: Alles auswählen

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

		wx.Frame.__init__(self, parent, -1, 'Handschrift-Editor', size = (210*2, 297*2+65), style= wx.CLOSE_BOX | wx.SYSTEM_MENU | wx.CAPTION)
		self.Bind(wx.EVT_CLOSE, self.OnClose)
		self.Bind(wx.EVT_LEFT_DOWN, self.OnClick)
		self.Bind(wx.EVT_ACTIVATE, self.OnPaint)
		self.SetBackgroundColour('white')
		self.Centre()

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

		self.OnPaint(None)
		self.Show(True)

	def OnClose(self, event):
		print "close"
		self.Destroy()

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

Re: Maus Event wird unter Toolbar-Icon nicht erkannt

Verfasst: Samstag 10. Dezember 2011, 22:08
von Gremlin
Mit einem "funktionierenden" Beispiel zum reproduzieren wäre hier vielleicht etwas mehr los ;)

Re: Maus Event wird unter Toolbar-Icon nicht erkannt

Verfasst: Sonntag 11. Dezember 2011, 21:07
von Kegelkugel

Code: Alles auswählen

import wx

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

                wx.Frame.__init__(self, parent, -1, 'Handschrift-Editor', size = (210*2, 297*2+65), style= wx.CLOSE_BOX | wx.SYSTEM_MENU | wx.CAPTION)
                self.Bind(wx.EVT_CLOSE, self.OnClose)
                self.Bind(wx.EVT_LEFT_DOWN, self.OnClick)
                self.Bind(wx.EVT_ACTIVATE, self.OnPaint)
                self.SetBackgroundColour('white')
                self.Centre()

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

                self.OnPaint(None)
                self.Show(True)

        def OnClose(self, event):
                print "close"
                self.Destroy()

        def OnClick(self, event):
                self.dots.append(event.GetPosition())
                self.OnPaint(None)
       
        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()
EditorHandWindow(None)
app.MainLoop()
Ich hab' jetzt die "import" Zeile, und die drei Zeilen am Schluss hinzugefügt. Bei mir klappt's. Als Bild könnt ihr einfach irgendein Bild verwenden, damit ihr seht, was ich meine. Klickt man unter das Bild, wird der Punkt nicht gezeichnet.

Grüße,
Markus

Re: Maus Event wird unter Toolbar-Icon nicht erkannt

Verfasst: Sonntag 11. Dezember 2011, 21:53
von Gremlin
"Das" funktioniert bei dir? Also ich bekomme folgenden Fehler, wie auch beim vorherigen Beispiel:

C++ assertion "wxAssertFailure" failed at ..\..\src\msw\dcclient.cpp(219) in wxP
aintDC::wxPaintDC(): wxPaintDC may be created only in EVT_PAINT handler!

Re: Maus Event wird unter Toolbar-Icon nicht erkannt

Verfasst: Montag 12. Dezember 2011, 15:29
von Kegelkugel
Ja, das funktioniert bei mir ;-)

Python 2.7.2
wxPython 2.8.11.0 (gtk2-unicode)
Ubuntu Linux 11.10

Du kannst ja die "OnPaint(None)" Aufrufe weglassen. Dann musst du aber das Fenster verschieben, damit du die Punkte siehst. Vielleicht klappt's dann bei dir.

Re: Maus Event wird unter Toolbar-Icon nicht erkannt

Verfasst: Montag 12. Dezember 2011, 15:43
von Gremlin
Kegelkugel hat geschrieben:Ubuntu Linux 11.10
Da liegt der Hund wohl begraben. Ich nutze Windows. ;)

Kann dir also nicht weiterhelfen, denn selbst mit einem Refresh bzw. Update im OnClick event bewirkt die DrawPoint Methode nichts. :K

Re: Maus Event wird unter Toolbar-Icon nicht erkannt

Verfasst: Montag 12. Dezember 2011, 17:25
von Kegelkugel
Ok, trotzdem Danke :-)

Re: Maus Event wird unter Toolbar-Icon nicht erkannt

Verfasst: Montag 12. Dezember 2011, 18:16
von Dav1d
Mh bei mir funktioniert es, evt. mal in der Mailingliste oder auf irc.freenode.net#wxpython fragen, wenn sich hier keiner mehr meldet.

Re: Maus Event wird unter Toolbar-Icon nicht erkannt

Verfasst: Mittwoch 14. Dezember 2011, 22:51
von bwbg
@OP: Ich habe dein Beispiel etwas umschreiben müssen, damit es überhaupt funktioniert (auch Windows). Grundsätzlich sollte man ein wx.PaintDC nicht "einfach so" erzeugen. Wenn ich mich richtig erinnere, dann ist das sogar dokumentiert.

Der richtige Weg ist, wx.EVT_PAINT mit OnPaint zu verbinden. Hier MUSS dann ein PaintDC erzeugt werden. Manuell aktuallisieren kann man mit der Methode Refresh, welche ihrerseits einen EVT_PAINT auslöst. OnPaint darf demnach NICHT manuell aufgerufen werden.

Korrigierte Fassung:
http://paste.pocoo.org/show/520976/

---

Bei mir trat nun allerdings folgendes Phänomen auf:

Die Positionen aus event.GetPosition waren vertikal versetzt um die Höhe der Toolbar.

Darauf hin habe ich eine neue Version entwickelt, welches für das Click&Paint-Ding ein eigenes Panel vorsieht. Dieses verhält sich erwartungsgemäß:
http://paste.pocoo.org/show/520977/

Fazit: Nicht auf die event-Positionen in "blanken" Frames verlassen. Panels bieten zudem die Möglichkeiten, die Widgets wiederzuverwenden. Sicherlich ist dieses Verhalten irgendwo dokumentiert, aber allzusehr stecke ich auch nicht in der Materie.

Grüße ...

Re: Maus Event wird unter Toolbar-Icon nicht erkannt

Verfasst: Freitag 13. Januar 2012, 14:22
von Kegelkugel
Hallo,

tut mir leid, dass ich mich nicht gemeldet hab', aber ich hatte irgendwie keine Benachrichtigung bekommen (oder nicht gelesen oder irgendetwas anderes), die mich daran erinnert, dass hier eine Antwort geschrieben wurde. Ich bin jetzt nur durch Zufall wieder auf das Thema gestoßen. Entschuldigung. :(

Zurück zum Thema: ich hab' deine Beispiele ausprobiert, es gab aber wieder das gleiche Problem wie zuvor. Die Klicks werden nicht erkannt.

Trotzdem Danke! :)

Grüße,
kegelkugel