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)

但事实证明,下拉列表中的两项将触发相同的功能(我希望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)

上面的代码显示了一个主框架,其中有一个下拉列表和下拉列表中的两个项目。但是,当我单击这两个项目中的任何一个时,不再触发任何功能。

那么,我该如何实现我的目标:将不同的函数绑定到 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 回答
0

我回来问我自己的问题。我认为这不是完美的解决方案,但它设法解决了我的问题。

这是代码:

类 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.choice_click)

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

def choice_click(self, event):
    if self._droplist.GetStringSelection() == "Test_A":
        self.Test_A__click()
    elif self._droplist.GetStringSelection() == "Test_B":
        self.Test_B_click()

在上面的代码中。我在 wx.Choice 组件和我想触发的函数之间放置了另一层。一旦我们有了匹配,它的相应函数就会被触发。

恐怕这不是一个有效的方法。因此,如果有人能提出一个好的解决方案,我将不胜感激。非常感谢。

于 2014-01-20T13:34:25.673 回答