我正在尝试使用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组件中的每个项目,并使它们正确触发函数。
感谢。
答案 0 :(得分: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 语句,但假设我们已为控件中的所有选项设置了所有方法。
答案 1 :(得分: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组件和我想要触发的函数之间添加了另一层。一旦匹配,就会触发相应的功能。
恐怕这不是一种有效的方法。如果有人能提出一个好的解决方案,我将非常感激。非常感谢。