wx.button events bei press und release

Plattformunabhängige GUIs mit wxWidgets.
Antworten
joh#
User
Beiträge: 129
Registriert: Freitag 6. November 2009, 13:16

Mittwoch 30. April 2014, 09:25

Hallo,

ich habe mit

Code: Alles auswählen

self.Bind(wx.EVT_BUTTON,    self.handlerfunc,    self.button1)
versucht, den Druck auf eine Taste auszuwerten.
self.handlerfunc wird aber erst bei Loslassen des buttons aufgerufen, nicht wie benötigt/erwartet
schon beim Drücken.
Was wäre richtigerweise hinzuschreiben, bzw. wie können die beiden events voneinander unterschieden werden?
Gruß
joh
BlackJack

Mittwoch 30. April 2014, 09:28

@joh#: Möchtest Du denn wirklich einen Button haben der sich anders verhält als die Nutzer das erwarten?
joh#
User
Beiträge: 129
Registriert: Freitag 6. November 2009, 13:16

Mittwoch 30. April 2014, 11:35

BlackJack hat geschrieben:@joh#: Möchtest Du denn wirklich einen Button haben der sich anders verhält als die Nutzer das erwarten?
ich denke mal der Nutzer erwartet doch das die Aktion dann kommt. wenn er den Button drückt, und nicht erst wenn er diesen loslässt?
Konkrete Anwendung bei mir ist, zum testen logische Pegel auf GPIO's zu schalten (=1 solange button gedrückt, =0 sonst)

Aber ein toggel oder Taster Verhalten wäre auch nicht schlecht...

Gruß
joh
BlackJack

Mittwoch 30. April 2014, 12:39

@joh#: Also das normale Verhalten ist bei allen mir bekannten GUI-Toolkits inklusive die ”nativen” bei Windows und MacOS, das die Aktion erst ausgeführt wird wenn man die Maustaste loslässt, und zwar über der Schaltfläche. Was man unter anderem nutzen kann um es sich noch mal anders zu überlegen und die Maus bei gedrückter Taste wieder von der Schaltfläche herunterziehen kann. Es mag sein das es Nutzer gibt, denen das noch nie (bewusst) aufgefallen ist, aber denen es aufgefallen ist, die werden das Verhalten bei Schaltflächen normalerweise erwarten.

Für Dein Vorhaben wirst Du wohl die Maus-Ereignisse direkt selber verarbeiten müssen.
joh#
User
Beiträge: 129
Registriert: Freitag 6. November 2009, 13:16

Mittwoch 30. April 2014, 15:10

BlackJack hat geschrieben:@joh#: Also das normale Verhalten ist,... das die Aktion erst ausgeführt wird wenn man die Maustaste loslässt, .... Es mag sein das es Nutzer gibt, denen das noch nie (bewusst) aufgefallen ist,...
ja, jetzt fällt es mir auch wie Schuppen aus den Haaren :idea:
BlackJack hat geschrieben: Für Dein Vorhaben wirst Du wohl die Maus-Ereignisse direkt selber verarbeiten müssen.
das mache ich dann wie? Der handler bekommt neben self ein e (wohl der event) übergeben.
Daraus muss sich die Information ob Maus oder Tastatur der Sender war gewinnen lassen,
bzw wenn es die Maus war, dann schauen, ob sie dabei über dem button war? Oje oje . . .
BlackJack

Mittwoch 30. April 2014, 15:24

@joh#: Naja die entsprechenden Mausereignisse kann man ja an die Schaltfläche binden. Dann braucht man weder feststellen ob es die Tastatur war, denn die löst keine Mausereignisse aus, noch ob es über der Schaltfläche passierte, denn das ist natürlich der Fall wenn man die Ereignisse von dort abgreift.
Piet Lotus
User
Beiträge: 80
Registriert: Dienstag 14. November 2006, 10:40

Donnerstag 1. Mai 2014, 17:02

Hallo joh,
unabhängig der vorherigen Anmerkungen...
...versucht, den Druck auf eine Taste auszuwerten.
self.handlerfunc wird aber erst bei Loslassen des buttons aufgerufen, nicht wie benötigt/erwartet
schon beim Drücken. ...
wxPython bietet mit wx.EVT_KEY_DOWN und wx.EVT_KEY_UP die Möglichkeit den Tastendruck, bzw. das Loslassen zu erkennen.
Viele Grüße
Piet Lotus
joh#
User
Beiträge: 129
Registriert: Freitag 6. November 2009, 13:16

Freitag 2. Mai 2014, 19:00

Piet Lotus hat geschrieben:Hallo joh,
unabhängig der vorherigen Anmerkungen...
...versucht, den Druck auf eine Taste auszuwerten.
self.handlerfunc wird aber erst bei Loslassen des buttons aufgerufen, nicht wie benötigt/erwartet
schon beim Drücken. ...
wxPython bietet mit wx.EVT_KEY_DOWN und wx.EVT_KEY_UP die Möglichkeit den Tastendruck, bzw. das Loslassen zu erkennen.
Viele Grüße
Piet Lotus
danke, damit hat es jetzt auch funktioniert. Allerdings sieht man es dem button jetzt nicht mehr an, ob er gedrückt wurde

Code: Alles auswählen

...
self.bGPIO_30 = wx.Button(self,  wx.ID_ANY, 'GPIO_30')
self.bGPIO_30.Bind(wx.EVT_LEFT_DOWN, self.OnGPIO_30ButtonDown)
self.bGPIO_30.Bind(wx.EVT_LEFT_UP, self.OnGPIO_30ButtonUp)
...
Gruß
joh
Piet Lotus
User
Beiträge: 80
Registriert: Dienstag 14. November 2006, 10:40

Montag 5. Mai 2014, 20:28

Hallo Joh,
joh# hat geschrieben:...Allerdings sieht man es dem button jetzt nicht mehr an, ob er gedrückt wurde
Was meinst du damit genau? Was siehst du und was erwartest du?
Viele Grüße
Piet Lotus
joh#
User
Beiträge: 129
Registriert: Freitag 6. November 2009, 13:16

Montag 5. Mai 2014, 21:11

Piet Lotus hat geschrieben:Hallo Joh,
joh# hat geschrieben:...Allerdings sieht man es dem button jetzt nicht mehr an, ob er gedrückt wurde
Was meinst du damit genau? Was siehst du und was erwartest du?
Piet Lotus
na wenn ein Button gedrückt wird (linke Maustaste) erscheint er doch auf dem Bildschirm
'tiefer' (eben richtig hineingedrückt), beim Loslassen kommt er wieder heraus.
Genau das sehr ich jetzt Nicht, die handlerfunktionen werden aber ordnungsgemäß
angesprungen, auch beim Mouseover kommt es zur üblichen 'leichten Verfärbung'

Aber alles in allem kann ich jetzt damit leben.

Gruß
joh
Antworten