在wxpython中可以将列表“设置”为ComboBox吗?

3 投票
3 回答
7871 浏览
提问于 2025-04-17 06:35

你好,我知道用列表可以做到这个,不过用下拉框(ComboBox)能做到吗?有没有类似于“set”这个功能的东西?

我试着在下拉框上用“set”,但出现了这个错误:
AttributeError: 'ComboBox'对象没有'设置'这个属性。

谢谢。

3 个回答

1

http://www.wxpython.org/docs/api/wx.ComboBox-class.html

__init__(parent, id, value, pos, size, choices, style, validator, name)

combobox = wx.ComboBox(self, choices=myList)

这段内容是关于一个叫做ComboBox的控件的初始化方法。ComboBox可以理解为一个下拉框,用户可以从中选择一个选项。

在这个方法中,有几个参数需要注意:

  • parent:这个是ComboBox的父级控件,简单来说,就是它放在哪里的那个地方。
  • id:这是给ComboBox一个唯一的标识符,用来区分不同的ComboBox。
  • value:这是ComboBox一开始显示的内容,也就是默认选中的选项。
  • pos:这个是ComboBox在界面上的位置,告诉它应该放在哪个地方。
  • size:这个是ComboBox的大小,决定它的宽度和高度。
  • choices:这是一个选项列表,里面包含了用户可以选择的所有选项。
  • style:这个是ComboBox的样式,决定它的外观,比如是否可以编辑等。
  • validator:这个是用来验证用户输入的内容,确保输入是有效的。
  • name:这是ComboBox的名字,可以用来在代码中引用它。

总的来说,这个方法就是用来创建一个下拉框,并设置它的一些基本属性和行为。

1

我觉得你是在问怎么在“运行时”添加新的项目?也就是说,在表单创建之后?如果是这样的话,看看下面的代码吧;-)

   def UpdateCitiesCombo(self):
    self.cmbCities.Clear()
    pc = PostalCode()
    if self.txtPostalCode.Value:
        cities = pc.GetFromCode(int(self.txtPostalCode.Value))
        for city in cities:
            self.cmbCities.Append(city[2])

    items = self.cmbCities.GetItems()

    index = -1
    try:
        if self.customer.city != "":
            index = items.index(self.customer.city)
        else:
            index = 0

        self.cmbCities.SetSelection(index)

    except ValueError:
        self.cmbCities.SetValue(self.customer.city)

简单来说,你需要注意的是ComboBox的Clear()和Append()这两个方法,还有这个函数是从某个事件中调用的。希望这正是你想要的。

6

你可以用 SetItems(myList) 这个方法把一个列表放进下拉框(ComboBox)里,这样会把原来的内容覆盖掉。

补充一下:在下拉框里创建列表的最常见方法是这样的:

myList = ["dog", "cat", "hamster"]
cbo = wx.ComboBox(self, choices=myList)

不过,因为下拉框是从 ItemContainer 这个类继承来的,所以你也可以用下面这个完整的例子来实现:

import wx

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

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="Test")
        panel = wx.Panel(self)

        myList = ["dog", "cat", "hamster"]
        cbo = wx.ComboBox(panel)
        cbo.SetItems(myList)

        self.Show()

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

撰写回答