如何实时重置wxpython中combobox的选择?

1 投票
4 回答
2998 浏览
提问于 2025-04-20 14:14

我正在尝试用语音模块制作一个相对简单的文本转语音(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

这对我有效,我把 EVT_COMBOBOX_DROPDOWN 绑定到更新列表上,然后把 EVT_COMBOBOX 绑定到用户选择时运行一个函数。这样一来,先更新列表,然后再显示更新后的内容。如果新的选择项变少了,就不会留下之前那些选项的空白。此外,你还可以把下拉框设置为只读,这样用户就不能编辑它,只能选择。下面的代码是在 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()
0

我参考的是C++的WxWidgets文档,而不是wxPython的,因为通常C++的文档更好一些 :),不过名字应该是一样的。

wxComboBox是从wxItemContainer这个类派生出来的,wxItemContainer有一系列叫做Set的函数,你可以把一串字符串传进去,这样就可以设置下拉框的内容了。还有AppendInsert这两个函数可以用来添加选项,还有一个Clear函数可以清空所有的选择。

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

1

wx.ComboBox的父类是 ItemContainer

它有一个叫做 Clear() 的方法。

你可以在 wx.ComboBox 对象上使用 Clear() 方法来清空所有数据。

2

组合框(ComboBox)是文本框(TextCtrl)和列表框(ListBox)的结合体。你可以在这里找到更多信息:http://wxpython-users.1045709.n5.nabble.com/Question-on-wx-ComboBox-Clear-td2353059.html

如果你想重置这个输入框,可以使用 self.presetbox.SetValue('') 这行代码。

(前提是你的组合框不是只读的)

撰写回答