Seite 1 von 1

Bind von EVT_MENU ruft die Funktion nicht auf

Verfasst: Mittwoch 23. Februar 2011, 21:50
von kaschpal
Hallo zusammen,

ich bin gerade dabei mein Projekt von Tkinter auf wxPython umzuziehen, also noch etwas unsicher.
Im folgenden Codeschnipsel versuche ich, automatisiert mein Menü aufzubauen (was auch klappt), einzig der Eventhandler macht genau gar nichts. Genauer gesagt, er wird nicht aufgerufen.

key ist einfach ein String
entry ist die Funktion, die aufgerufen werden soll:

Code: Alles auswählen

commandItem = menu.Append(-1, key)        # add entry
print commandItem, commandItem.GetId(), entry
handler = ( lambda evt: entry() )
self.Bind(wx.EVT_MENU, handler, id=commandItem.GetId() ) # add handler

Wie gesagt, das Einbinden des Menüpunktes funktioniert, jedoch beim Anklicken wird der Handler nicht aufgerufen.
Kann mir jemand sagen, was ich hier falsch mache? (vermutlich ein typischer Anfängerfehler ...)
(Achja: sollten automatisch zugewiesene ids nicht < 0 sein? Sind sie hier nicht ...)

Gruß und Danke im Voraus!

Ulrich

Re: Bind von EVT_MENU ruft die Funktion nicht auf

Verfasst: Mittwoch 23. Februar 2011, 22:25
von BlackJack
kaschpal: Woran siehst Du denn das die Funktion nicht aufgerufen wird?

Und nein, generierte IDs müssen nicht negativ sein.

Re: Bind von EVT_MENU ruft die Funktion nicht auf

Verfasst: Donnerstag 24. Februar 2011, 05:53
von kaschpal
BlackJack hat geschrieben:kaschpal: Woran siehst Du denn das die Funktion nicht aufgerufen wird?
Na, ein Menüeintrag zeigt auf eine Testfunktion, die mir einen Text ausgibt und wenn ich auf den Eintrag klicke, wird die Funktion eben nicht aufgerufen.

Ulrich

Re: Bind von EVT_MENU ruft die Funktion nicht auf

Verfasst: Donnerstag 24. Februar 2011, 12:34
von BlackJack
@kaschpal: Also bei mir funktioniert das hier problemlos:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import wx


def entry():
    print 'klick'


def main():
    app = wx.PySimpleApp()
    frame = wx.Frame(None, title='Test')
    menubar = wx.MenuBar()
    menu = wx.Menu()
    menu_entry = menu.Append(wx.ID_ANY, 'Testeintrag')
    menubar.Append(menu, 'Test')
    frame.SetMenuBar(menubar)
    handler = lambda _evt: entry()
    frame.Bind(wx.EVT_MENU, handler, menu_entry)
    frame.Show()
    app.MainLoop()


if __name__ == '__main__':
    main()

Re: Bind von EVT_MENU ruft die Funktion nicht auf

Verfasst: Donnerstag 24. Februar 2011, 16:54
von kaschpal
Ah danke, ich weiß jetzt auch warum: Ich hab den Event an self gebunden, welches selber ein wx.Menu ist. Dort landet der Event nicht. Wenn ich ihn an den zugehörigen Frame binde, gehts!

Gruß, Ulrich