ausgelöster Event einer Klasse in anderen Klasse abfangen

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
stasikz
User
Beiträge: 18
Registriert: Donnerstag 5. Juli 2007, 21:34

Hallo Community!
ich habe folgendes Problem: Mein Programm ist ziemlich umfangreich, deshalb habe ich es in mehrere Dateien aufgeteilt. Hier ein kurzer Ausschnitt davon:
prog.py

Code: Alles auswählen

#!/usr/bin/env python
#prog.py

import wx, wx.aui
from MyListCtrl import SearchListCtrl

class MyFrame(wx.Frame): #Hauptfenster(Window)

    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, size=(840, 600))

        hsplitter = wx.SplitterWindow(self, style = wx.SP_3D | wx.SP_LIVE_UPDATE) 
        
        tabs = wx.aui.AuiNotebook(hsplitter)
        self.tabs = tabs
        panel_unten = wx.Panel(hsplitter)
        # ListCtrl mit Sucheinträgen
        search_listctrl = SearchListCtrl(tabs)
        self.Bind(EVT_START_DOWNLOAD, self.start_download)
        tabs.AddPage(search_listctrl, "test")
        
        hsplitter.SplitHorizontally(tabs, panel_unten, 350) 
        hsplitter.SetMinimumPaneSize(130)

        self.Fit()
        self.SetSizeHintsSz(self.GetSize())
    
    def start_download(self, event= None):
        item_data, item = wx.GetApp().item_container.pop()
        print item_data, item

class MyApp(wx.App):

    def OnInit(self):
        frame = MyFrame(None, -1, 'Proggi')
        frame.Centre()
        frame.Show(True)
        self.item_container = []
        return True
        
if __name__ == '__main__':
    app = MyApp(0)
    app.MainLoop()
und
MyListCtrl.py

Code: Alles auswählen

#!/usr/bin/env python
#MyListCtrl.py

import wx, sys
from wx.lib.newevent import NewEvent

(StartDownloadEvent, EVT_START_DOWNLOAD) = NewEvent()

class SearchListCtrl(wx.ListCtrl):
    
    def __init__(self, parent, size=(-1,-1)):
        wx.ListCtrl.__init__(self, parent, -1, style=wx.LC_REPORT, size=size)
        self.InsertColumn(sys.maxint, u'Titel')
        self.SetColumnWidth(0, 500)
        
        self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnDoubleClick)

    def OnDoubleClick(self, event):
        listctrl = event.GetEventObject()
        item = listctrl.GetItem(0)
        item_data = listctrl.GetItemData(0)
        wx.GetApp().item_container.append([item_data,item])

        # Event-Instanz erstellen 
        evt = StartDownloadEvent() 
        # Event auslösen 
        self.ProcessEvent(evt)
wenn Ich jetzt auf ein Item in search_listctrl klicke wird die Funktion self.OnDoubleClick ausgelöst, diese sammelt daten und fügt diese in ein Container, dabei lösst diese Fkt. einen selbst definirten Event (EVT_START_DOWNLOAD) aus.
Dieser Event soll jetzt in der Frame Klasse aufgefangen werden und dort eine andere Fkt. starten. Leider wird dieser Event in der Frame-klasse nicht aufgefangen.
Kann mir jemand helfen dieses Problem zu lösen?!
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

Du kannst doch in der Methode 'OnDoubleClick(self, event)' einfach einen Aufruf der Methode in deinem Frame starten - warum machst du das nicht?

Code: Alles auswählen

def OnDoubleClick(self, event):
    this.parent.start_download()
Ich glaube das macht auch das was du möchtest, oder vestehe ich dich da falsch?
Benutzeravatar
stasikz
User
Beiträge: 18
Registriert: Donnerstag 5. Juli 2007, 21:34

Lonestar hat geschrieben:Du kannst doch in der Methode 'OnDoubleClick(self, event)' einfach einen Aufruf der Methode in deinem Frame starten - warum machst du das nicht?

Code: Alles auswählen

def OnDoubleClick(self, event):
    this.parent.start_download()
Ich glaube das macht auch das was du möchtest, oder vestehe ich dich da falsch?
Hallo Lonestar!
Du meinst wahrscheinlich self.parent.start_download()?
SearchListCtrl hat als parent aber ein auiNoteBook und auiNoteBook ist Child von SplitterWindow. start_download() ist aber die Fkt von MyFrame Klasse, wenn ich also auf die Funktion zugreifen will, dann muss ich self.parent.parent.parent.start_download() schreiben, und das ist in meinen Augen nicht sehr elegant. Außerdem funktioniert mein Code wenn ich beide Dateien zu einer hinzufüge.
Benutzeravatar
stasikz
User
Beiträge: 18
Registriert: Donnerstag 5. Juli 2007, 21:34

Habe mein Problem folgendermassen gelöst:
prog.py

Code: Alles auswählen

#!/usr/bin/env python
#prog.py

import wx, wx.aui
from MyListCtrl import SearchListCtrl, EVT_START_DOWNLOAD #Event importiert

class MyFrame(wx.Frame): #Hauptfenster(Window)

    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, size=(840, 600))

        hsplitter = wx.SplitterWindow(self, style = wx.SP_3D | wx.SP_LIVE_UPDATE) 
        
        tabs = wx.aui.AuiNotebook(hsplitter)
        self.tabs = tabs
        panel_unten = wx.Panel(hsplitter)
        # ListCtrl mit Sucheinträgen
        search_listctrl = SearchListCtrl(tabs)
        search_listctrl.Bind(EVT_START_DOWNLOAD, self.start_download) #hier search_listctrl statt self
        tabs.AddPage(search_listctrl, "test")
        
        hsplitter.SplitHorizontally(tabs, panel_unten, 350) 
        hsplitter.SetMinimumPaneSize(130)

        self.Fit()
        self.SetSizeHintsSz(self.GetSize())
    
    def start_download(self, event= None):
        item_data, item = wx.GetApp().item_container.pop()
        print item_data, item

class MyApp(wx.App):

    def OnInit(self):
        frame = MyFrame(None, -1, 'Proggi')
        frame.Centre()
        frame.Show(True)
        self.item_container = []
        return True
        
if __name__ == '__main__':
    app = MyApp(0)
    app.MainLoop()
und
MyListCtrl.py

Code: Alles auswählen

#!/usr/bin/env python
#MyListCtrl.py

import wx, sys
from wx.lib.newevent import NewEvent

(StartDownloadEvent, EVT_START_DOWNLOAD) = NewEvent()

class SearchListCtrl(wx.ListCtrl):
    
    def __init__(self, parent, size=(-1,-1)):
        wx.ListCtrl.__init__(self, parent, -1, style=wx.LC_REPORT, size=size)
        self.InsertColumn(sys.maxint, u'Titel')
        self.SetColumnWidth(0, 500)
        
        self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnDoubleClick)

    def OnDoubleClick(self, event):
        listctrl = event.GetEventObject()
        item = listctrl.GetItem(0)
        item_data = listctrl.GetItemData(0)
        wx.GetApp().item_container.append([item_data,item])

        # Event-Instanz erstellen 
        evt = StartDownloadEvent() 
        # Event auslösen 
        self.ProcessEvent(evt)
Antworten