如何实时重置wxpython中combobox的选择?
我正在尝试用语音模块制作一个相对简单的文本转语音(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 个回答
这对我有效,我把 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()
我参考的是C++的WxWidgets文档,而不是wxPython的,因为通常C++的文档更好一些 :),不过名字应该是一样的。
wxComboBox
是从wxItemContainer
这个类派生出来的,wxItemContainer
有一系列叫做Set
的函数,你可以把一串字符串传进去,这样就可以设置下拉框的内容了。还有Append
和Insert
这两个函数可以用来添加选项,还有一个Clear
函数可以清空所有的选择。
wxItemContainer
的文档在这里:http://docs.wxwidgets.org/trunk/classwx_item_container.html
wx.ComboBox
的父类是 ItemContainer
。
它有一个叫做 Clear()
的方法。
你可以在 wx.ComboBox
对象上使用 Clear()
方法来清空所有数据。
组合框(ComboBox)是文本框(TextCtrl)和列表框(ListBox)的结合体。你可以在这里找到更多信息:http://wxpython-users.1045709.n5.nabble.com/Question-on-wx-ComboBox-Clear-td2353059.html
如果你想重置这个输入框,可以使用 self.presetbox.SetValue('') 这行代码。
(前提是你的组合框不是只读的)