如何使用wxpython实时重置组合框的选择?

时间:2014-09-09 02:01:48

标签: python combobox wxpython

所以我试图使用语音模块制作一个相对简单的TTS程序。我遇到的地方是:我想通过窗口中的组合框列出已保存的文本列表,如果您添加或删除任何预设,它将无法更新选项,直到程序重新加载。有没有办法实时更新选择?

组合框初始化如下:

#I have a previously set txt file with a list of presets, and its partial destination saved in a variable "savefile"
fh = open(savefile + '//presets.txt')
presets = fh.read().split('\n')
self.presetList = presets
#self.presetList is now the list of choices for the combobox, causing it to update upon loading the program
self.presetbox = wx.ComboBox(self, pos=(90, 100), size=(293, -1), choices=self.presetList, style=wx.CB_READONLY)
self.Bind(wx.EVT_COMBOBOX, self.EvtComboBox, self.presetbox)

然后,比如说,为了清除所有选择,我需要这样的东西:

self.emptyList = []
self.presetbox.SetChoices(self.emptyList)

有办法做到这一点吗?如果是这样,那就太棒了! :)

4 个答案:

答案 0 :(得分:1)

ComboBox是TextCtrl和ListBox(http://wxpython-users.1045709.n5.nabble.com/Question-on-wx-ComboBox-Clear-td2353059.html

的混合体

要重置字段,您可以使用self.presetbox.SetValue('')

(如果您的ComboBox不是READONLY)

答案 1 :(得分:0)

我正在引用C ++ WxWidgets文档而不是wxPython文档,因为它们通常更好:),但名称应该相同。

wxComboBox派生自wxItemContainer,它有一系列简单称为Set的函数,您可以在字符串列表中传递以设置组合框内容。您还可以使用AppendInsert个函数,以及清除所有选项的Clear函数。

wxItemContainer个文档在这里:http://docs.wxwidgets.org/trunk/classwx_item_container.html

答案 2 :(得分:0)

这对我有用,绑定EVT_COMBOBOX_DROPDOWN来更新列表,而不是绑定EVT_COMBOBOX来运行用户选择的功能。那样更新,然后显示更新的内容。如果新选择较少,则不会留下先前选择的空白区域。此外,您可以将组合框设置为READONLY,以表现为选择窗口小部件(不可由用户编辑),如下所示。此代码在Windows,Python 3.6和较新的wxpython(phoenix)下进行了测试。

import wx  
class Mywin(wx.Frame): 
   def __init__(self, parent, title): 
      super(Mywin, self).__init__(parent, title = title,size = (300,200)) 

      panel = wx.Panel(self) 
      box = wx.BoxSizer(wx.VERTICAL) 
      self.label = wx.StaticText(panel,label = "Your choice:" ,style = wx.ALIGN_CENTRE) 
      box.Add(self.label, 0 , wx.EXPAND |wx.ALIGN_CENTER_HORIZONTAL |wx.ALL, 20) 
      cblbl = wx.StaticText(panel,label = "Combo box",style = wx.ALIGN_CENTRE) 

      box.Add(cblbl,0,wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL|wx.ALL,5) 
      #                initial chioces are 5
      #------------------------------------------------------
      languages = ['C', 'C++', 'Python', 'Java', 'Perl']
      #------------------------------------------------------
      self.combo = wx.ComboBox(panel,choices = languages, style = wx.CB_READONLY)
      box.Add(self.combo,0,wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL|wx.ALL,5) 

      self.combo.Bind(wx.EVT_COMBOBOX         ,self.OnCombo)
      self.combo.Bind(wx.EVT_COMBOBOX_DROPDOWN,self.updatelist)

      panel.SetSizer(box) 
      self.Centre() 
      self.Show() 

   def OnCombo(self, event): 
      self.label.SetLabel("You selected "+self.combo.GetValue()+" from Combobox")

   def updatelist(self, event):
      #             Chioces are now just 2
      #------------------------------------------------------
      OtrosLanguajes = ['C++', 'Python']
      #------------------------------------------------------
      self.combo.SetItems(OtrosLanguajes)

app = wx.App() 
Mywin(None,  'ComboBox and Choice demo') 
app.MainLoop()

答案 3 :(得分:0)

wx.ComboBox 的父类是 ItemContainer

它有 Clear() 方法。

Clear() 对象使用 wx.ComboBox 方法清除所有数据。