2010-10-18 3 views
1

J'ai une interface graphique très simple qui accepte deux paramètres, puis appelle trois autres classes dont les noms sont DigitalFilter(), BeatByBeatVariables() et GetSummaryOfWholeTest(). C'est la première fois que j'écris des cours et j'ai besoin d'aide pour la syntaxe. En particulier, pouvez-vous m'aider avec l'héritage? Je souhaite que la classe de l'interface graphique MainWindow (wx.Frame) soit appelée lors du lancement de l'application. Ensuite, lorsque l'utilisateur clique sur self.button dans l'interface graphique, je veux que l'application exécute d'abord myFilter = DigitalFilter (TestID, FilterTimePeriod), puis exécuter myBeatByBeat = BeatByBeatVariables (arg1, arg2), et enfin exécuter myTestSummary = GetSummaryOfWholeTest (argA, argB)Héritage de classe pour GUI en utilisant wxpython

Notez que myBeatByBeat ne peut pas commencer à s'exécuter tant que myFilter n'a pas été créé, car l'instanciation de myFilter crée des fichiers csv qui sont requis comme entrées de myBeatByBeat. De même, myTest Summary ne peut pas commencer à s'exécuter tant que myBeatByBeat n'a pas été créé car l'instanciation de myBeatByBeat crée des fichiers csv qui sont requis en entrée de myTestSummary. Quelqu'un peut-il me montrer la syntaxe appropriée pour écrire/instancier ces classes avec l'héritage approprié afin que le travail de chaque classe soit fait dans une séquence qui respecte leurs relations d'entrée/sortie? Je suppose que l'héritage devrait être employé ici, mais je ne sais pas ce qui devrait hériter de quoi. Je ne sais pas non plus si je ne vois pas d'autres concepts nécessaires pour donner au code les interrelations nécessaires.

Voici un résumé du code correspondant:

class DigitalFilter(): 
    def __init__(self,TestID,FilterTimePeriod): 
    # All the code for the digital filter goes here. 
    # I am omitting this class' code for simplicity. 

class BeatByBeatVariables(): 
    def __init__(self,arg1,arg2): 
    # I am omitting this class' code for simplicity 

class GetSummaryOfWholeTest(): 
    def __init__(self,argA,ArgB): 
    # This class' code is omitted for simplicity 

class MainWindow(wx.Frame): 
    def __init__(self, parent,id,title): 
     wx.Frame.__init__(self,parent,wx.ID_ANY,title, size = (500,500), style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE) 

     # Create self.editname and self.edithear in code that I am omitting for simplicity 
     self.button =wx.Button(self, label="Click here to filter the data", pos=(200, 125)) 
     self.Bind(wx.EVT_BUTTON, self.OnClick,self.button) 

    def OnClick(self,event): 
     FilterTimePeriod = self.editname.GetValue() 
     TestID = self.edithear.GetValue() 
     myFilter=DigitalFilter(TestID,FilterTimePeriod) 
     myBeatByBeat = BeatByBeatVariables(arg1,arg2) 
     myTestSummary = GetSummaryOfWholeTest(argA,argB) 

app = wx.PySimpleApp() 
frame = MainWindow(None,-1,"Filtering Software. Version 1.0") 
app.MainLoop() 

Note: J'utilise Python 2.6 parce que je suis également en utilisant numpy et sciepy

Répondre

1

On dirait que vous êtes un peu confus au sujet de ce que moyens d'héritage. Les classes qui héritent d'une classe de base ajoutent des fonctionnalités supplémentaires à cette classe de base, cela n'implique rien à propos de l'ordre d'instanciation ou du passage des données. Si tout ce que vous voulez faire est d'appliquer la séquence de création d'objet, vous devriez utiliser wx.lib.pubsub pour savoir quand chaque étape est terminée.

Vous pouvez envoyer un message à partir de DigitalFilter lorsque le filtrage est terminé et le recevoir dans une instance BeatByBeatVariables déjà instanciée ou le recevoir dans votre classe principale et créer l'occurrence BeatByBeatVariables à ce moment-là. Les deux fonctionnent. Si je savais que je aurais besoin tous ces cas, je créerais probablement eux à l'avance, comme ceci:

from wx.lib.pubsub import setupkwargs # needed only in version 2.8.11 
from wx.lib.pubsub import pub 

class DigitalFilter(): 
    def __init__(self,TestID,FilterTimePeriod): 
     pass 
    def do_something(self, data): 
     # do something 
     pub.sendMessage('filter.done', data=some_data) 

class BeatByBeatVariables(): 
    def __init__(self,arg1,arg2): 
     pub.subscribe(self.do_something, 'filter.done') 
    def do_something(self, data): 
     # do something 
     pub.sendMessage('beatbybeat.done', data=some_data) 

class GetSummaryOfWholeTest(): 
    def __init__(self,argA,ArgB): 
     pub.subscribe(self.do_something, 'beatbybeat.done') 
    def do_something(self, data): 
     # do something 
     pub.sendMessage('summary.done', data=some_data) 

Ensuite, dans votre classe principale, vous pouvez avoir:

def OnClick(self,event): 
     FilterTimePeriod = self.editname.GetValue() 
     TestID = self.edithear.GetValue() 
     myFilter=DigitalFilter(TestID,FilterTimePeriod) 
     myBeatByBeat = BeatByBeatVariables(arg1,arg2) 
     myTestSummary = GetSummaryOfWholeTest(argA,argB) 

     myFilter.do_something() 
     # all the other do_somethings are triggered by message passing 
Questions connexes