Наследование классов для GUI с использованием wxpython - PullRequest
1 голос
/ 19 октября 2010

У меня очень простой графический интерфейс, который принимает два параметра и затем вызывает три других класса, чьи имена - DigitalFilter (), BeatByBeatVariables () и GetSummaryOfWholeTest (). Я впервые пишу классы, и мне нужна помощь с синтаксисом.

В частности, вы можете помочь мне с наследованием? Я хочу, чтобы класс GUI MainWindow (wx.Frame) вызывался при запуске приложения. Затем, когда пользователь нажимает на self.button в графическом интерфейсе, я хочу, чтобы приложение сначала запустило myFilter = DigitalFilter (TestID, FilterTimePeriod), затем второй запуск myBeatByBeat = BeatByBeatVariables (arg1, arg2) и, наконец, третий запуск myTestSummaryW = GetSummary Арга, ARGB)

Обратите внимание, что myBeatByBeat не может начать работать, пока не завершится создание myFilter, потому что создание экземпляра myFilter создает файлы csv, которые необходимы в качестве входных данных для myBeatByBeat. Аналогично, myTest Summary не может начать выполняться, пока не завершится создание myBeatByBeat, поскольку создание экземпляра myBeatByBeat создает файлы csv, которые необходимы в качестве входных данных для myTestSummary.

Может ли кто-нибудь показать мне правильный синтаксис для написания / создания экземпляров этих классов с соответствующим наследованием, чтобы работа каждого класса выполнялась в последовательности, которая учитывает их отношения ввода / вывода?

Я предполагаю, что здесь должно использоваться наследование, но я не знаю, что должно наследоваться от чего. Я также не знаю, не вижу ли я другие концепции, необходимые для придания коду необходимых взаимосвязей.

Вот краткий обзор соответствующего кода:

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()

Примечание: я использую Python 2.6, потому что я также использую numpy и sciepy

1 Ответ

1 голос
/ 24 октября 2010

Похоже, вы немного озадачены тем, что означает наследование. Классы, которые наследуются от базового класса, добавляют к этому базовому классу дополнительную функциональность, это ничего не значит о порядке создания экземпляров или передаче данных. Если все, что вы хотите сделать, это установить последовательность создания объекта, вы должны использовать wx.lib.pubsub, чтобы знать, когда заканчивается каждый шаг.

Вы можете отправить сообщение из DigitalFilter после завершения фильтрации и либо получить его в уже созданном экземпляре BeatByBeatVariables, либо получить его в своем основном классе и создать экземпляр BeatByBeatVariables в это время. Оба работают. Если бы я знал, что мне понадобятся все эти экземпляры, я бы, вероятно, создал их раньше времени, например:

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)

Тогда в вашем основном классе вы можете иметь:

    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...