Bind von EVT_MENU ruft die Funktion nicht auf

Plattformunabhängige GUIs mit wxWidgets.
Antworten
kaschpal
User
Beiträge: 3
Registriert: Mittwoch 23. Februar 2011, 21:37

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
BlackJack

kaschpal: Woran siehst Du denn das die Funktion nicht aufgerufen wird?

Und nein, generierte IDs müssen nicht negativ sein.
kaschpal
User
Beiträge: 3
Registriert: Mittwoch 23. Februar 2011, 21:37

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
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()
kaschpal
User
Beiträge: 3
Registriert: Mittwoch 23. Februar 2011, 21:37

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
Antworten