0

wx.Choice コンポーネントを使用して単純なアプリケーションを作成しようとしています。

アイデアは、多数の項目が wx.Choice にリストされ、それぞれが固有の機能をトリガーするというものです。

コードの最初のバージョンは次のとおりです。

class MainFrame(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, 0, 'wxPython pull-down choice', size = (400, 300))
        panel_select_model= wx.Panel(self, -1)
        model_list = ['Test_A', 'Test_B']
        self._model_type = None

        self._stat_tex = wx.StaticText(panel_select_model, 1, "Select Model Type:", (15, 20))
        self._droplist = wx.Choice(panel_select_model, 2, (150, 18), choices = model_list)

        """ Bind A Panel """
        self._droplist.SetSelection(0)
        self._droplist.Bind(wx.EVT_CHOICE, self.Test_A_click)

しかし、ドロップダウン リストの 2 つの項目が同じ機能をトリガーすることがわかりました (私は、Test_Aがその機能をトリガーし、Test_B単に何もしないことを期待しています)。Test_Bだから私は別の方法にバインドしようとしますTest_B_click

class MainFrame(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, 0, 'wxPython pull-down choice', size = (400, 300))
        panel_select_model= wx.Panel(self, -1)
        model_list = ['Test_A', 'Test_B']
        self._model_type = None

        self._stat_tex = wx.StaticText(panel_select_model, 1, "Select Model Type:", (15, 20))
        self._droplist = wx.Choice(panel_select_model, 2, (150, 18), choices = model_list)

        """ Bind A Panel """
        self._droplist.SetSelection(0)
        self._droplist.Bind(wx.EVT_CHOICE, self.Test_A_click)

        """ Bind B Panel """
        self._droplist.SetSelection(1)
        self._droplist.Bind(wx.EVT_CHOICE, self.Test_B_click)

上記のコードは、メイン フレーム、その中のドロップ リスト、およびドロップ リスト内の 2 つの項目を表示します。ただし、2 つの項目のいずれかをクリックすると、機能がトリガーされなくなります。

では、目標を達成するにはどうすればよいでしょうか: wx.Choice コンポーネント内の各項目にさまざまな関数をバインドし、それらが関数を正しくトリガーするようにします。

ありがとう。

4

2 に答える 2

2

あなたの方法論は、おそらくあなたが望むことを行うための最も一般的な方法であり、何が起こっているのかを伝えるのも非常に簡単です. ただし、メタプログラミングを少し加えてこれを行うと、正しく設定すれば少しきれいになる可能性があります。

import wx

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

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="Callbacks")
        panel = wx.Panel(self)
        self.choice = wx.Choice(panel, choices=["test_A", "test_B"])
        self.choice.Bind(wx.EVT_CHOICE, self.onChoice)
        self.Show()

    #----------------------------------------------------------------------
    def onChoice(self, event):
        choice = self.choice.GetStringSelection()
        method = getattr(self, "on_%s" % choice)
        method()

    #----------------------------------------------------------------------
    def on_test_A(self):
        print "You chose test_A!"

    #----------------------------------------------------------------------
    def on_test_B(self):
        print "You chose test_B!"


#----------------------------------------------------------------------
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyFrame()
    app.MainLoop()

ここでは、Python のgetattr関数を使用して、実際に呼び出すメソッドを決定します。これにより、 ifステートメントの使用をスキップできますが、コントロール内のすべての選択肢に対してすべてのメソッドが設定されていることを前提としています。

于 2014-01-20T16:32:37.447 に答える