Event wird nicht ausgelöst

Plattformunabhängige GUIs mit wxWidgets.
Antworten
diablo75
User
Beiträge: 30
Registriert: Dienstag 8. September 2009, 23:12

Hy @ all
Habe ein Problem das mein Event einfach nicht ausgeführt wird - selbst beim debugen mit nen breakpoint hüpft er nicht rein.

Code: Alles auswählen

class CustomMenuBar (wx.MenuBar):
    def __init__(self):
        wx.MenuBar.__init__(self,-1)
        menuDatei = wx.Menu()
        self.Append(menuDatei,"Datei")
        menuhelp = wx.Menu()
        self.Append(menuhelp,"Hilfe")
        menuDatei.AppendSeparator()
        Beenden = menuDatei.Append(-1,"Beenden")
        self.Bind(wx.EVT_MENU,self.OnExit, Beenden)
        
    def OnExit(self,event): #Funkt nicht
        print("Hallo")
        self.Close(True)  
Weiters würde self.Close(True) funktionieren? Da ja self meine CustomMenuBar ist oder würde das mit self.Destroy() funktionieren?

Im Buch WxPython in Action ist ein ähnliches Beispiel und dort funktioniert es.

Thx für eure Hilfe
Flano
User
Beiträge: 43
Registriert: Sonntag 5. September 2004, 14:13

Werde nicht so recht schlau aus deinem Beispiel. Ich vermisse einen Frame, wo vor dem schließen def OnExit() ausgeführt wird. Vielleicht hilft dir das weiter:

Code: Alles auswählen

self.Bind(wx.EVT_CLOSE, self.OnExit)

Code: Alles auswählen

def OnExit(self, event):
    print('Hallo')
    self.Destroy()
Gruß Flano
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Du musst logischerweise den Frame schließen und nicht die Menubar.

Es muss also so in der Art aussehen:

Code: Alles auswählen

class CustomMenuBar(wx.MenuBar):
    def __init__(self, frame):
        wx.MenuBar.__init__(self, frame, -1)
        self.frame = frame
        menuDatei = wx.Menu()
        self.Append(menuDatei,"Datei")
        menuhelp = wx.Menu()
        self.Append(menuhelp, "Hilfe")
        menuDatei.AppendSeparator()
        Beenden = menuDatei.Append(-1, "Beenden")
        self.Bind(wx.EVT_MENU, self.OnExit, Beenden)
        
    def OnExit(self,event): #Funkt nicht
        print("Hallo")
        self.frame.Close(True)
und bitte halte dich an den Python Style Guide.
diablo75
User
Beiträge: 30
Registriert: Dienstag 8. September 2009, 23:12

So sieht der komplette Code aus

Code: Alles auswählen

import wx
import time
from TreeFrame import TreePanel
from KdSuchPanel import KdSuchPanel

class MainFrame(wx.Frame):
    def __init__(self,parent,id,title):
        # begin MainFrame.__init__
        wx.Frame.__init__(self,parent,id,title)
        
        self._icon = wx.EmptyIcon()
        self._icon.CopyFromBitmap(wx.Bitmap("wxpdemo.ico", wx.BITMAP_TYPE_ANY))
        self.SetIcon(self._icon)
        self.SetSize((1155, 640))
        
        mainpanel = TreePanel(self, -1)
        secondpanel =KdSuchPanel(self, -1)
   
        sizer_1 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_1.Add(mainpanel,1, wx.EXPAND)
        sizer_1.Add(secondpanel,6, wx.EXPAND)
        self.SetSizer(sizer_1)
        self.Layout_

        self.sb = CustomStatusBar(self)
        self.SetStatusBar(self.sb)
        
        self.mb = CustomMenuBar()
        self.SetMenuBar(self.mb)
        
        def OnCloseWindow(self):
            self.Destroy()
        
        self.Bind(wx.EVT_CLOSE, OnCloseWindow)
        

class CustomMenuBar (wx.MenuBar):
    def __init__(self):
        wx.MenuBar.__init__(self,-1)
        menuDatei = wx.Menu()
        self.Append(menuDatei,"Datei")
        menuhelp = wx.Menu()
        self.Append(menuhelp,"Hilfe")
        menuDatei.AppendSeparator()
        Beenden = menuDatei.Append(-1,"Beenden")
        self.Bind(wx.EVT_MENU,self.OnExit, Beenden)
        
    def OnExit(self,event):
        print("Hallo")
        self.MainFrame.Close(True)   #Funkt nicht
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Code: Alles auswählen

import wx

class MainFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title)
        
        self.mb = CustomMenuBar(self)
        self.SetMenuBar(self.mb)
        
    def Exit(self):
            self.Destroy()
        
class CustomMenuBar (wx.MenuBar):
    def __init__(self, frame):
        wx.MenuBar.__init__(self)
        self.frame = frame
        menuDatei = wx.Menu()
        self.Append(menuDatei,"Datei")
        Beenden = menuDatei.Append(-1 ,"Beenden")
        self.frame.Bind(wx.EVT_MENU, self.OnExit, Beenden)
       
    def OnExit(self,event):
        self.frame.Exit()   #Funkt nicht

app = wx.PySimpleApp()
frame = MainFrame(None, -1, 'title')
frame.Show()
app.MainLoop()
Das Binding muss an den Frame.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
diablo75
User
Beiträge: 30
Registriert: Dienstag 8. September 2009, 23:12

Thx das funktioniert

Was mich aber etwas verwundert ist: Das es ohne

Code: Alles auswählen

app = wx.PySimpleApp()
frame = MainFrame(None, -1, 'title')
funktioniert.

Habe es auf:

Code: Alles auswählen

class CustomMenuBar (wx.MenuBar):
    def __init__(self,MainFrame):
        wx.MenuBar.__init__(self)

        self.frame=MainFrame
geändert und funktioniert ebenfalls
Antworten